一朱灿、先從源碼看起:
mHandler.post(new Runnable(){
? ? ? ? ? ?@Override
? ? ? ? ? ? public void run(){
? ? ? ? ? ? ? ? ? ? ? ?//TODO
? ? ? ? ? ? ? }
});
其中run方法中寫更新UI的代碼衡招,其實(shí)只是把這個Runnable當(dāng)成一條消息來處理歉提,下面看源碼:
public final boolean post(Runnable?r)
{
? ? ? ? ? ? return sendMessageDelayed(getPostMessage(r),0);
}
private static Message?getPostMessage(Runnable?r)?{
? ? ? ? ? ? ? ? ? ?Message?m?=?Message.obtain();
? ? ? ? ? ? ? ? ? m.callback?=?r;
? ? ? ? ? ? ? ? ? return m;
}
可以看到尘颓,在getPostMessage中,得到了一個Message對象姚糊,然后將我們創(chuàng)建的Runable對象作為callback屬性遏弱,賦值給了此message.
注:產(chǎn)生一個Message對象,可以new ?弦蹂,也可以使用Message.obtain()方法肩碟;兩者都可以,但是更建議使用obtain方法凸椿,因?yàn)镸essage內(nèi)部維護(hù)了一個Message池用于Message的復(fù)用削祈,避免使用new 重新分配內(nèi)存。
public final boolean sendMessageDelayed(Message?msg,long delayMillis)
{
? ? ? ? ? ? ? ?if(delayMillis?<0)?{
? ? ? ? ? ? ? ? ? ? ? ? ? delayMillis?=0;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?return sendMessageAtTime(msg,?SystemClock.uptimeMillis()?+?delayMillis);
}
public boolean sendMessageAtTime(Message?msg,long uptimeMillis)?{
? ? ? ? ? ? ? ? MessageQueue?queue?=?mQueue;
? ? ? ? ? ? ? ? if(queue?==null)?{
? ? ? ? ? ? ? ? ? ? ? ? ? RuntimeException?e?=new RuntimeException(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? this+"?sendMessageAtTime()?called?with?no?mQueue");
? ? ? ? ? ? ? ? ? ? ? ? ? ?Log.w("Looper",?e.getMessage(),?e);
? ? ? ? ? ? ? ? ? ? ? ? ? ?return false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return enqueueMessage(queue,?msg,?uptimeMillis);
}
最終和handler.sendMessage一樣脑漫,調(diào)用了sendMessageAtTime髓抑,然后調(diào)用了enqueueMessage方法,給msg.target賦值為handler优幸,最終加入MessagQueue.
可以看到启昧,這里msg的callback和target都有值,那么會執(zhí)行哪個呢劈伴?
其實(shí)上面已經(jīng)貼過代碼密末,就是dispatchMessage方法:
public void dispatchMessage(Message?msg)?{
? ? ? ? ? ? if(msg.callback?!=null)?{
? ? ? ? ? ? ? ? ? ? ?handleCallback(msg);
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? ? ? if(mCallback?!=null)?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(mCallback.handleMessage(msg))?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? handleMessage(msg);
? ? ? ? ?}
}
第2行握爷,如果不為null,則執(zhí)行callback回調(diào)严里,也就是我們的Runnable對象新啼。