Handler源码分析

Message:数据载体

  • int what //标识
  • int arg1 //保存int数据
  • int arg2 //保存int数据
  • Object obj //保存任意数据
  • int when //记录应该被处理的时间值
  • Handler target //用来处理消息的Handler,就是发送它的handler
  • Runable callback;//用来处理消息的回调器(一般不用)
  • Message next;//指向下一个message用来形成一个链表
  • Message sPool;//用来缓存处理过的message对象,以便复用
  • obatain()//它使用了Message中的消息池(sPool)

Handler:发送消息,处理消息,移除消息

1.发送消息

  • sendEmptyMessage(int what)
  • sendMessage(Message msg)
  • sendEmptyMessageDelayed(int what,long time)
  • sendMessageDelayed(Message msg,long time)
  • sendMessageAtTime(Message msg,long time)
  • enqueueMessage(MessageQueue queue,Message msg,long time)//保存发送消息的Handler对象到消息里面,将消息添加到消息队列,

2.移除消息

  • removeMessage(int what)//调用消息队列移除它内部的指定what的消息

3.处理消息

  • handleMessage(Message msg) //处理消息的回调方法
  • dispatchMessage(Message msg)
  if (msg.callback != null) {//如果Message有回调则自己处理
            handleCallback(msg);
        } else {
            if (mCallback != null) {//如果handler对象中有回调监听器调用回调器来处理消息
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);//让Handler的handleMessage()来处理
        }

MessageQueue:存储以Message的when排序优先级消息队列

  • enqueueMessage(Message msg,long when) 将message添加到队列,
       //指定消息应该被处理的时间,将当前消息对象保存到消息队列中的一个合  适位置,
     for (;;) {
                   prev = p;
                   p = p.next;
                   if (p == null || when < p.when) {
                       break;
                   }
                   if (needWake && p.isAsynchronous()) {
                       needWake = false;
                   }
               }
         nativeWake(mPtr);//通过本地方法实现对处理等待状态的底层线程
  • next():取出一个合适的Message对象,可能不会立即返回

Looper(钩子):从MessageQueue中获取当前需要处理的消息,并交给Handler处理

  • loop():核心方法
     final Looper me = myLooper();//得到looper对象
     final MessageQueue queue = me.mQueue;//得到消息队列对象
     for (;;) {
        Message msg = queue.next(); // might block 
        msg.target.dispatchMessage(msg);//调用handler去分发消息并处理消息
        msg.recycleUnchecked();//回收利用消息
        }

你可能感兴趣的:(Handler源码分析)