码迷,mamicode.com
首页 > 移动开发 > 详细

android-handler、looper、messageQueue、message

时间:2015-05-19 22:13:27      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

  Handler创建,必须有个一个Looper,主线程自己创建了。其他线程需要自己创建,默认是没有的。创建方法

  1. 这种方法是先创建一个系统定义好的HandlerThread,这个是跑在非UI线程中的,已经创建好了looper,直接用就可以了.创建handler有多个构造函数,具体看源码

    HandlerThread threadhandler = new HandlerThread("1111");
    threadhandler.start();
    myhandler = new myHandler(threadhandler.getLooper());

   2. 自己创建一个新的线程,在线程中调用Looper.prepare();然后写处理message回调方法,接着还要调用looper.loop();
  class LooperThread extends Thread {
   public Handler mHandler;
  
  public void run() {
Looper.prepare();

mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};

Looper.loop();
}
}
  为什么一定要有一个Looper呢?
  因为handler的无参数构造函数里需要looper,如果为空就抛异常。
  如何设置looper?
调用Looper.prepare();这里会判断当前的线程是不是已经有looper了,有的话会抛异常,这就是说一个线程只能有一个looper。
Message是什么,有什么用?
存放消息的用的,它有很多属性。特别说明target,表示的就是处理它的handler,next属性,这就是利用了链表结构来构造的消息队列,message.next表示着当前消息的下一个,是按照时间来的,只能顺序不能反过来,他没有prev属性。
MessageQueue是什么,有什么用?
用来操作messages,例如handler发送消息过来,他需要把消息按照顺序串起来。还有处理完消息后他需要把消息从消息队列中删除等等。
handler有什么用?
发送和处理消息。handler通过sendmessage等方法发送消息,最终都是通过sendMessageAtTime来处理发送给MessageQueue。然后通过looper回调函数msg.target.dispatchMessage(msg)-->handler的handleMessage()方法具体处理。
handler还可以使用post方法将runnable传给消息队列message有callback属性,在looper的dispatchMessage()方法中,如果是runnable就直接run()了;

最后有个疑问:到底是什么样的机制可以让looper循环去处理message?

   while (true) {  

          Message msg = queue.next(); // might block    

     if (msg != null) {  

    if (msg.target == null) {    

      return;  

            }  

    if (me.mLogging!= null) me.mLogging.println(  ">>>>> Dispatching to " + msg.target + " "  

     + msg.callback + ": " + msg.what   );  

    msg.target.dispatchMessage(msg);  

    if (me.mLogging!= null) me.mLogging.println(  "<<<<< Finished to    " + msg.target + " "  

     + msg.callback);  

      msg.recycle();  

    }  

  看到Message msg = queue.next(); // might block 这句话,获得待处理的message,这里可能会堵塞,没有message的时候就循环等待,直到messageQueue退出


android-handler、looper、messageQueue、message

标签:

原文地址:http://www.cnblogs.com/liming-saki/p/4515283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!