深入理解Android消息機(jī)制(一)初識(shí)

本系列相關(guān)閱讀


Android的消息機(jī)制主要是指Handler運(yùn)行機(jī)制芽丹。由于Android開(kāi)發(fā)規(guī)范明確表示只能在主線(xiàn)程更新UI,因此當(dāng)子線(xiàn)程完成工作,我們需要使用Handler切換到主線(xiàn)程執(zhí)行UI更新操作盐股。

Handler的使用方式非常簡(jiǎn)單,我們只需要在主線(xiàn)程中創(chuàng)建Handler對(duì)象并重寫(xiě)handleMessage方法:

final SafeHandler safeHandler = new SafeHandler(this);

private static class SafeHandler extends Handler {

    private WeakReference<Context> contextWeakReference;

    public SafeHandler(Context context) {
        this.contextWeakReference = new WeakReference<>(context);
    }

    @Override
    public void handleMessage(Message msg) {
        if (contextWeakReference != null) {
            Context context = contextWeakReference.get();
            if (context != null) {
                //更新UI操作
                switch (msg.what) {
                    case 0:
                        Toast.makeText(context, "更新UI", Toast.LENGTH_SHORT).show();
                        break;
                    case 1:
                        break;
                    default:
                        break;
                }
            }
        }
        super.handleMessage(msg);
    }
}

然后在子線(xiàn)程中就可以發(fā)送消息提醒主線(xiàn)程更新UI:

new Thread(new Runnable() {
    @Override
    public void run() {
        safeHandler.sendEmptyMessage(0);//子線(xiàn)程通知主線(xiàn)程更新UI
    }
}).start();

Handler之所以能如此便捷地實(shí)現(xiàn)線(xiàn)程間的消息傳遞,當(dāng)然離不開(kāi)底層的MessageQueueLooper的支持。

簡(jiǎn)單介紹一下它們:

  • MessageQueue 消息隊(duì)列
    用來(lái)緩存一系列待處理的消息比吭,它的內(nèi)部存儲(chǔ)結(jié)構(gòu)并不是真正的隊(duì)列,而是采用單鏈表結(jié)構(gòu)來(lái)存儲(chǔ)消息列表姨涡。
  • Looper 循環(huán)
    MessageQueue不能處理消息衩藤,這個(gè)工作由Looper來(lái)完成。它是以無(wú)限循環(huán)的形式去詢(xún)問(wèn)是否有新消息涛漂,如果有的話(huà)就處理赏表,如果沒(méi)有就一直等待。
  • ThreadLocal
    一個(gè)線(xiàn)程內(nèi)部的數(shù)據(jù)存儲(chǔ)類(lèi)怖喻,通過(guò)它可以在 指定的線(xiàn)程中存儲(chǔ)數(shù)據(jù)底哗,數(shù)據(jù)存儲(chǔ)以后岁诉,只有在指定線(xiàn)程中可以獲取到存儲(chǔ)的數(shù)據(jù)锚沸,對(duì)于其他線(xiàn)程來(lái)說(shuō)則無(wú)法獲取到數(shù)據(jù)。【這是一篇詳細(xì)介紹ThreadLocal的文章涕癣,點(diǎn)擊查看】

我們知道哗蜈,Handler在創(chuàng)建的時(shí)候會(huì)采用當(dāng)前線(xiàn)程的Looper來(lái)構(gòu)建消息循環(huán)系統(tǒng),那么它是如何獲取到當(dāng)前線(xiàn)程的Looper的坠韩?答案就是使用ThreadLocal距潘,通過(guò)ThreadLocal可以輕松獲取每個(gè)線(xiàn)程的Looper。如果想繼續(xù)了解如何獲取線(xiàn)程Looper點(diǎn)擊深入理解Android消息機(jī)制(三)原理分析檀夹。

有一點(diǎn)我們要注意:線(xiàn)程在默認(rèn)情況下是沒(méi)有Looper的刃跛,如果需要使用Handler就必須為線(xiàn)程創(chuàng)建Looper穴吹,否則系統(tǒng)會(huì)拋出異常 Can't create handler inside thread that has not called Looper.prepare()。根據(jù)我們的開(kāi)發(fā)經(jīng)驗(yàn)洞翩,Android中的主線(xiàn)程是可以直接使用Handler的稽犁,因?yàn)橄到y(tǒng)在創(chuàng)建ActivityThread的時(shí)候會(huì)為主線(xiàn)程初始化Looper。

總結(jié):本文簡(jiǎn)單地介紹一些消息機(jī)制基本概念骚亿,順帶著演示了Handler使用步驟已亥,目的就是為了讓大家對(duì)消息機(jī)制有個(gè)大致的了解,下一篇會(huì)介紹消息機(jī)制的具體流程来屠。

下一篇:深入理解Android消息機(jī)制(二)Handler工作過(guò)程

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虑椎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俱笛,更是在濱河造成了極大的恐慌捆姜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迎膜,死亡現(xiàn)場(chǎng)離奇詭異娇未,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)星虹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)零抬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人宽涌,你說(shuō)我怎么就攤上這事平夜。” “怎么了卸亮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵忽妒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我兼贸,道長(zhǎng)段直,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任溶诞,我火速辦了婚禮鸯檬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘螺垢。我一直安慰自己喧务,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布枉圃。 她就那樣靜靜地躺著功茴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孽亲。 梳的紋絲不亂的頭發(fā)上坎穿,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼玲昧。 笑死犯祠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酌呆。 我是一名探鬼主播衡载,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼隙袁!你這毒婦竟也來(lái)了痰娱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤菩收,失蹤者是張志新(化名)和其女友劉穎梨睁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體娜饵,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坡贺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箱舞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遍坟。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖晴股,靈堂內(nèi)的尸體忽然破棺而出愿伴,到底是詐尸還是另有隱情,我是刑警寧澤电湘,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布隔节,位于F島的核電站,受9級(jí)特大地震影響寂呛,放射性物質(zhì)發(fā)生泄漏怎诫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一贷痪、第九天 我趴在偏房一處隱蔽的房頂上張望幻妓。 院中可真熱鬧,春花似錦呢诬、人聲如沸涌哲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至哪廓,卻和暖如春狗唉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涡真。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工分俯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肾筐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓缸剪,卻偏偏與公主長(zhǎng)得像吗铐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杏节,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354