Message:數(shù)據(jù)載體
- int what //標(biāo)識(shí)
- int arg1 //保存int數(shù)據(jù)
- int arg2 //保存int數(shù)據(jù)
- Object obj //保存任意數(shù)據(jù)
- int when //記錄應(yīng)該被處理的時(shí)間值
- Handler target //用來(lái)處理消息的Handler,就是發(fā)送它的handler
- Runable callback;//用來(lái)處理消息的回調(diào)器(一般不用)
- Message next;//指向下一個(gè)message用來(lái)形成一個(gè)鏈表
- Message sPool;//用來(lái)緩存處理過(guò)的message對(duì)象涝开,以便復(fù)用
- obatain()//它使用了Message中的消息池(sPool)
Handler:發(fā)送消息循帐,處理消息,移除消息
1.發(fā)送消息
- 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)//保存發(fā)送消息的Handler對(duì)象到消息里面,將消息添加到消息隊(duì)列,
2.移除消息
- removeMessage(int what)//調(diào)用消息隊(duì)列移除它內(nèi)部的指定what的消息
3.處理消息
- handleMessage(Message msg) //處理消息的回調(diào)方法
- dispatchMessage(Message msg)
if (msg.callback != null) {//如果Message有回調(diào)則自己處理
handleCallback(msg);
} else {
if (mCallback != null) {//如果handler對(duì)象中有回調(diào)監(jiān)聽(tīng)器調(diào)用回調(diào)器來(lái)處理消息
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);//讓Handler的handleMessage()來(lái)處理
}
MessageQueue:存儲(chǔ)以Message的when排序優(yōu)先級(jí)消息隊(duì)列
- enqueueMessage(Message msg,long when) 將message添加到隊(duì)列,
//指定消息應(yīng)該被處理的時(shí)間,將當(dāng)前消息對(duì)象保存到消息隊(duì)列中的一個(gè)合 適位置舀武,
for (;;) {
prev = p;
p = p.next;
if (p == null || when < p.when) {
break;
}
if (needWake && p.isAsynchronous()) {
needWake = false;
}
}
nativeWake(mPtr);//通過(guò)本地方法實(shí)現(xiàn)對(duì)處理等待狀態(tài)的底層線程
- next():取出一個(gè)合適的Message對(duì)象,可能不會(huì)立即返回
Looper(鉤子):從MessageQueue中獲取當(dāng)前需要處理的消息拄养,并交給Handler處理
- loop():核心方法
final Looper me = myLooper();//得到looper對(duì)象
final MessageQueue queue = me.mQueue;//得到消息隊(duì)列對(duì)象
for (;;) {
Message msg = queue.next(); // might block
msg.target.dispatchMessage(msg);//調(diào)用handler去分發(fā)消息并處理消息
msg.recycleUnchecked();//回收利用消息
}