android-handler、looper、messageQueue、message

  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属性。
  这里需要说一下他的Spool静态属性,这是一个消息池,Spool自己就是一个Message对象,刚开始的时候他是null的,什么时候它有东西的呢?
  void recycleUnchecked() {
   // Mark the message as in use while it remains in the recycled object pool.
   // Clear out all other details.
   flags = FLAG_IN_USE;
   what = 0;
   arg1 = 0;
   arg2 = 0;
   obj = null;
     replyTo = null;
   sendingUid = -1;
   when = 0;
   target = null;
  callback = null;
  data = null;

  synchronized (sPoolSync) {
  if (sPoolSize < MAX_POOL_SIZE) {
   next = sPool;
   sPool = this;
   sPoolSize++;
  }
  }
  }
  看这个方法,这个方法是looper中循环处理完一个message之后做的事情,它回收了这个message,并且将这个被回收的message和已有的Spool链接起来,再将Spool指向这个回收的message,利用这种方法将回收的message都给串了起来。
  message -> spool -> null
  spool(被回收的message)-> message(旧的spool) -> null
  消息池怎么被使用的?
  public static Message obtain() {
    synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0; // clear in-use flag
sPoolSize--;
return m;
}
}
  return new Message();
  }
  利用obtain的方法得到一个消息池中的第一个空message,并且spool指向第二个元素,剩余的空消息数-1;

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)