Handler的一點理解

原理

參照終于明白了Handler的運行機制

個人的一點理解

??本質上,Handler的使用就是從一個MessageQueue中不斷取出其所綁定的Message,隨后調用其本身的handleMessage(...)方法郭计,但是使用Handler有三個基本要點:
??1.每個線程線程只有一個Looper指么,而Looper其實就是引用了一個MessageQueue

    public static void prepare() {
        prepare(true);
    }

    private static void prepare(boolean quitAllowed) {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        sThreadLocal.set(new Looper(quitAllowed));    //使得Looper和當前線程相關綁定起來
    }

??2.Looper.loop()包含了一個死循環(huán)for(;;)宴合,在該循環(huán)中不斷對當前線程唯一的Looper所引用的MessageQueeue執(zhí)行出椙。或者出隊列操作,并通過message.target驅使每一條信息所綁定的Handler對該條message進行處理物舒。

public static void loop() {
        final Looper me = myLooper();
        if (me == null) {
            throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
        }
        final MessageQueue queue = me.mQueue;
        for (;;) {
            Message msg = queue.next(); // might block
            if (msg == null) {
                // No message indicates that the message queue is quitting.
                return;
            }
            msg.target.dispatchMessage(msg);    //無論是調用post()還是setTarget()色洞,最后都會調用這個
            msg.recycleUnchecked();
        }
    }

??3.使用Handler.setTarget()或者Handler.post(...)在本質上就是往本線程對應的Looper傳入一個message,也就是進椆诳瑁或進隊列操作火诸,但兩種方法有一個細微區(qū)別,setTarget()的結果是使得message.callback = null荠察,而post(Runnable r)則是使得message.callback = r置蜀。這個細微區(qū)別就導致了是該條message的處理時機。實際上參照第2點代碼可以知道悉盆,方法loop()中每次出椂⒒纾或出隊列都會調用msg.target.dispatchMessage(msg);,那么接下來閱讀以下代碼:

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

??明顯可以看到方法內會根據(jù)message.callback是否為空選擇不同的操作來執(zhí)行,也就是說焕盟,如果Handler調用的不是setTarget()秋秤,而是post()的話,是不會執(zhí)行Handler的handleMessage(msg)的脚翘,而是直接調用post(Runnable r)中的參數(shù)

??還有相當重要的一點是灼卢,主線程會自動調用Looper.prepareMainLooper();來完成Looper的初始化,而我們手動創(chuàng)建的線程是需要自己去手動調用Looper.prepare()完成初始化才可以獲得一個指向MessageQueue的Looper来农。


??看完終于明白了Handler的運行機制的一點理解鞋真,隨手寫下來加強記憶,如果有錯誤沃于,請指正灿巧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市揽涮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饿肺,老刑警劉巖蒋困,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敬辣,居然都是意外死亡雪标,警方通過查閱死者的電腦和手機零院,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來村刨,“玉大人告抄,你說我怎么就攤上這事∏段” “怎么了打洼?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逆粹。 經常有香客問我募疮,道長,這世上最難降的妖魔是什么僻弹? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任阿浓,我火速辦了婚禮,結果婚禮上蹋绽,老公的妹妹穿的比我還像新娘芭毙。我一直安慰自己,他們只是感情好卸耘,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布退敦。 她就那樣靜靜地躺著,像睡著了一般鹊奖。 火紅的嫁衣襯著肌膚如雪苛聘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天忠聚,我揣著相機與錄音设哗,去河邊找鬼。 笑死两蟀,一個胖子當著我的面吹牛网梢,可吹牛的內容都是我干的。 我是一名探鬼主播赂毯,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼战虏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了党涕?” 一聲冷哼從身側響起烦感,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膛堤,沒想到半個月后手趣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡肥荔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年绿渣,在試婚紗的時候發(fā)現(xiàn)自己被綠了朝群。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡中符,死狀恐怖姜胖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情淀散,我是刑警寧澤右莱,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站吧凉,受9級特大地震影響隧出,放射性物質發(fā)生泄漏。R本人自食惡果不足惜阀捅,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一胀瞪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饲鄙,春花似錦凄诞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至轴咱,卻和暖如春汛蝙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朴肺。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工窖剑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戈稿。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓西土,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鞍盗。 傳聞我的和親對象是個殘疾皇子需了,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容