小知識:Handler中post/send

本篇內(nèi)容很簡單溯饵,純屬記錄方便日后記憶廷痘。

Handler消息機制細節(jié)就不多說了套耕。我們知道尘应,Looper不停的從消息隊列中取出Message惶凝,然后分發(fā)給對應的Handler去處理。Handler附屬于哪個線程取決于Handler構(gòu)造時對應的 Looper附屬的線程犬钢,即Handler構(gòu)造的時候就確定了苍鲜,它終究要為哪個線程的消息分發(fā)后的處理進行服務,也就決定了執(zhí)行 Handler#dispatchMessage所在的線程玷犹。

消息分發(fā)

Message和Handler關聯(lián)的方式很簡單混滔,用哪個Handler發(fā)送的消息,就用哪個Handler進行任務處理歹颓。最終會調(diào)用 Handler#dispatchMessage 進行消息處理:

public class Handler{
    public void dispatchMessage(@NonNull Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }
}

我們看到無論如何會有一個 Message 對象分發(fā)過來坯屿,Message對象可以選擇性的攜帶一些數(shù)據(jù)。

dispatchMessage 進行分發(fā)的時候分了3種情況:
1晴股、如果 msg對象 中有 callback 屬性愿伴,直接調(diào)用 callback#run 方法 「callback是一個實現(xiàn)了Runnable接口的實例」
2、Handler 對象中有 mCallback屬性电湘,直接調(diào)用 mCallback#handleMessage隔节,如果mCallback#handleMessage返回為true,分發(fā)結(jié)束寂呛;
3怎诫、如果mCallback#handleMessage返回false,則繼續(xù)執(zhí)行 Handler#handleMessage進行消息分發(fā)贷痪。

這里說明一下mCallback幻妓,不是Runnable類型,而是實現(xiàn)了如下類型「Callback」的實例劫拢,區(qū)別是有入?yún)⒑头祷刂怠?/p>

public interface Callback {
    boolean handleMessage(@NonNull Message msg);
}
Message發(fā)送

針對這種情況肉津,在發(fā)送Message的時候演化了很多種形式:【這里簡單列幾種】
首先定義Handler:

    class MyHandler : Handler {
        constructor() : super()
        constructor(callback: Callback) : super(callback)
        override fun handleMessage(msg: Message) {
            Log.e(MainActivity::class.java.name, "Handler - handleMessage: ${msg.what}")
        }
    }
一强胰、 Handler#postXXX(@NonNull Runnable r)
    private val handler0 = MyHandler()

    handler0.post {  // kotlin : lambda表達式
       Log.e(MainActivity::class.java.name, "Runnable - run")    
    }

最終消息分發(fā)回走上邊的第一種情況,直接結(jié)果:

    MainActivity: Runnable - run
二妹沙、 Handler#sendXXX(XXX)
    private val handler1 = MyHandler(Handler.Callback {msg ->
        Log.e(MainActivity::class.java.name, "Callback - handleMessage: ${msg.what}")
        true  //這里
    })

    handler1.sendEmptyMessage(11)

最終消息分發(fā)回走上邊的第二種情況偶洋,直接結(jié)果:

    MainActivity: Callback - handleMessage: 11
    private val handler2 = MyHandler(Handler.Callback {msg ->
        Log.e(MainActivity::class.java.name, "Callback - handleMessage: ${msg.what}")
        false  //這里
    })

    handler2.sendEmptyMessage(11)

最終消息分發(fā)回走上邊的第三種情況,直接結(jié)果:

    MainActivity: Callback - handleMessage: 11
    MainActivity: Handler - handleMessage: 11

總結(jié):總體來說 post 的參數(shù)是Runnable距糖,send的參數(shù)有一部分是 Message玄窝。不論哪種情況都會最終構(gòu)建一個Message對象,然后發(fā)送到對應線程的消息隊列中悍引。

還記得 Activity#runOnUiThread 方法的實現(xiàn)恩脂,也是使用了post的方法:

    public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趣斤,隨后出現(xiàn)的幾起案子俩块,更是在濱河造成了極大的恐慌,老刑警劉巖唬渗,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件典阵,死亡現(xiàn)場離奇詭異,居然都是意外死亡镊逝,警方通過查閱死者的電腦和手機壮啊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撑蒜,“玉大人歹啼,你說我怎么就攤上這事∽ぃ” “怎么了狸眼?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浴滴。 經(jīng)常有香客問我拓萌,道長,這世上最難降的妖魔是什么升略? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任微王,我火速辦了婚禮,結(jié)果婚禮上品嚣,老公的妹妹穿的比我還像新娘炕倘。我一直安慰自己,他們只是感情好翰撑,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布罩旋。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涨醋。 梳的紋絲不亂的頭發(fā)上瓜饥,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音浴骂,去河邊找鬼压固。 笑死,一個胖子當著我的面吹牛靠闭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坎炼,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼愧膀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谣光?” 一聲冷哼從身側(cè)響起檩淋,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萄金,沒想到半個月后蟀悦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡氧敢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年日戈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孙乖。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡浙炼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唯袄,到底是詐尸還是另有隱情弯屈,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布恋拷,位于F島的核電站资厉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔬顾。R本人自食惡果不足惜宴偿,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阎抒。 院中可真熱鬧酪我,春花似錦、人聲如沸且叁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至欺矫,卻和暖如春纱新,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背穆趴。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工脸爱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人未妹。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓簿废,卻偏偏與公主長得像,于是被迫代替她去往敵國和親络它。 傳聞我的和親對象是個殘疾皇子族檬,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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