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();//回收利用消息
}