Handler的post()方法解析

一朱灿、先從源碼看起:

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對象新啼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市刹碾,隨后出現(xiàn)的幾起案子燥撞,更是在濱河造成了極大的恐慌,老刑警劉巖迷帜,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件物舒,死亡現(xiàn)場離奇詭異,居然都是意外死亡戏锹,警方通過查閱死者的電腦和手機(jī)冠胯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锦针,“玉大人荠察,你說我怎么就攤上這事∧嗡眩” “怎么了悉盆?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長馋吗。 經(jīng)常有香客問我焕盟,道長,這世上最難降的妖魔是什么宏粤? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任京髓,我火速辦了婚禮,結(jié)果婚禮上商架,老公的妹妹穿的比我還像新娘堰怨。我一直安慰自己,他們只是感情好蛇摸,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布备图。 她就那樣靜靜地躺著,像睡著了一般赶袄。 火紅的嫁衣襯著肌膚如雪揽涮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天饿肺,我揣著相機(jī)與錄音蒋困,去河邊找鬼。 笑死敬辣,一個胖子當(dāng)著我的面吹牛雪标,可吹牛的內(nèi)容都是我干的零院。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼村刨,長吁一口氣:“原來是場噩夢啊……” “哼告抄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嵌牺,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤打洼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逆粹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體募疮,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年僻弹,在試婚紗的時候發(fā)現(xiàn)自己被綠了阿浓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡奢方,死狀恐怖搔扁,靈堂內(nèi)的尸體忽然破棺而出爸舒,到底是詐尸還是另有隱情蟋字,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布扭勉,位于F島的核電站鹊奖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涂炎。R本人自食惡果不足惜忠聚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唱捣。 院中可真熱鬧两蟀,春花似錦、人聲如沸震缭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拣宰。三九已至党涕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巡社,已是汗流浹背膛堤。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晌该,地道東北人肥荔。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓绿渣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親次企。 傳聞我的和親對象是個殘疾皇子怯晕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容