Handler發(fā)送消息的過程僅僅是向消息隊(duì)列中插入了一條消息,MessagQueue的next方法一會(huì)返回這條消息給Looper柒竞,Looper收到消息后就開始處理了政供。最終消息由Looper交由Handler處理,即Handler的dispatchMessage方法會(huì)被調(diào)用。dispatchMessage方法的源碼如下:
public void dispatchMessage(Message msg){
if(msg.callback != null){
handleCallback(msg);
}else{
if(mCallback != null){
if(mCallback.handleMessage(msg)){
return ;
}
}
handleMessage(msg);
}
}
首先檢查Message的callback是否為null布隔,不為null就通過handleCallback來處理消息离陶。Message的callback是一個(gè)Runnable對(duì)象,實(shí)際上就是Handler的Post方法所傳遞的Runnable參數(shù)衅檀。handleCallback的邏輯如下:
private static void handleCallback(Message message){
message.callback.run();
}
其次招刨,檢查mCallback是否為null,不為null就調(diào)用mCallback的handleMessage方法來處理消息哀军。Callback是一個(gè)接口沉眶,它的定義如下:
public interface Callback{
public boolean handleMessage(Message msg);
}
那么Callback的意義是什么呢?
它可以用來創(chuàng)建一個(gè)Handler的實(shí)例但不需要派生Handler的子類杉适。平時(shí)我們創(chuàng)建Handler的最常見的方法就是派生一個(gè)Handler的子類谎倔,重寫handlerMessage方法。而Callback給我們提供了另一種使用Handler的方式猿推,當(dāng)我們不想派生Handler的子類的時(shí)候片习,可以用Callback構(gòu)造Handler。
那么view.post(Runnable r)是怎么工作的呢蹬叭,源碼如下:
public boolean post(Runnable action) {
final AttachInfo attachInfo = mAttachInfo;
if (attachInfo != null) {
return attachInfo.mHandler.post(action);
}
// Assume that post will succeed later
ViewRootImpl.getRunQueue().post(action);
return true;
}
由此可見藕咏,view獲取到關(guān)聯(lián)線程(即UI線程,因?yàn)橹挥蠻I線程才能創(chuàng)建view)的handler秽五,然后調(diào)用該handler的post方法孽查,即把這個(gè)任務(wù)封裝成一個(gè)消息post到主線程的消息隊(duì)列中,然后等待執(zhí)行坦喘。