Android消息機制

Handler代表了Android系統(tǒng)中的消息機制芯义,Android系統(tǒng)中所有的事件都是通過Handler進行傳遞的储玫。

要理解Handler就不得不知道這幾個類 Looper墨坚、MessageQueue显蝌、ThreadLocal盖奈、Thread吏廉、ActivityThrad日戈、Message

類介紹

MessageQueue

單鏈數(shù)據(jù)結(jié)構(gòu)殷蛇,用來儲存管理系統(tǒng)中的消息

Message

重點是Message的when屬性康吵,他代表了消息執(zhí)行的時間劈榨,MessageQueue通過判斷當前時間是否大于Message的when時間來判斷是否將Message發(fā)送非Looper執(zhí)行

我們通過mHandler.sendMessageDelayed(Message , 1000);發(fā)送一個Message的時候?qū)嶋H上就設(shè)置這個消息的執(zhí)行時間是當前時間的1000毫秒之后等同于mHandler.sendMessageAtTime(Message, SystemClock.uptimeMillis() + 1000);

ThreadLocal

ThreadLocal解決了多線程程序的并發(fā)問題

它為每一個線程提供了一個獨立Looper的變量副本晦嵌,使得每一個不同線程中的Looper相對獨立互不影響

Looper

消息輪詢器同辣,它是一個死循環(huán)

每一個Looper對象都里面包含了一個MessageQueue

可以理解成使用死循環(huán)遍歷MessageQueue中的Message,把適合的消息拿出來執(zhí)行

Looper通過ThreadLocal與線程建立聯(lián)系惭载,在每一個線程中它都是一個單例旱函,所以可以理解Looper是一個線程安全的單例

分析

Looper創(chuàng)建并與Thread關(guān)聯(lián)

在ActivityThread的mian函數(shù)中


首先調(diào)用了Looper.prepareMainLooper(); 為主線程關(guān)聯(lián)了一個Looper

然后調(diào)用Looper.loop();開始輪詢;

剛才說了Looper是一個死循環(huán)描滔,為什么會是死循環(huán)呢?因為在學Java的時候就知道棒妨,當mian函數(shù)執(zhí)行完所有語句的時候就代表了程序結(jié)束,所有Looper在這里做死循環(huán)程序就不會退出伴挚。

我們可以推斷如果讓Looper退出死循環(huán)的話靶衍,我們的程序就退出了


myLooper() 是拿到當前線程對應(yīng)的Looper單例

sThreadLocal是ThreadLocal的實例通過set方法將Looper與Thread關(guān)聯(lián),然后在任何地方通過sThreadLocal.get()可以拿到Thread中的Looper實例



Handler的創(chuàng)建


Handler在創(chuàng)建的時候會通過Looper.myLooper();方法拿到Thread中的Looper對象茎芋。如果線程中沒有Thread對象Handler將會拋出異常


所以在子線程中使用Handler我們必須自己調(diào)用Looper.prepare();為這個子線程綁定Looper颅眶。然后調(diào)用Looper.loop();開始這個消息輪詢器

Handler于Looper的關(guān)系


我們在使用mHandler.sendMessage()發(fā)送一個Message的時候,Handler會將Message和Message執(zhí)行的時機(Message.when)添加到Looper中的MessageQueue中()田弥。這樣Looper在輪詢的時候就會在合適的時機拿到這個Message并且執(zhí)行涛酗。

Looper在拿到需要執(zhí)行的Message的時候會調(diào)用Handler.dispatchMessage()方法執(zhí)行Message。通過這個函數(shù)我們可以看出如果Message里面綁定了callback他會先直接執(zhí)行這個callback而不會執(zhí)行mCallback.handleMessage方法偷厦;這個callback實際上就是一個Runnable對象商叹;

如果Handler中設(shè)置了mCallback他會攔截Handler的handleMessage方法;這相當于給Handler增加了一個事件攔截的機制只泼。這個mCallback只能在通過Handler的構(gòu)造函數(shù)傳入


總結(jié)

通過分析Android的消息機制剖笙,我們可以知道我們傳入Handler中的Message統(tǒng)統(tǒng)被放到了Looper的MessageQueue中。MessageQueue會在何時的時候發(fā)送這個Message給Looper请唱,然后Looper將這個Message發(fā)送給Handler執(zhí)行弥咪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末过蹂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子聚至,更是在濱河造成了極大的恐慌酷勺,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扳躬,死亡現(xiàn)場離奇詭異脆诉,居然都是意外死亡,警方通過查閱死者的電腦和手機贷币,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門击胜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人役纹,你說我怎么就攤上這事潜的。” “怎么了字管?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長信不。 經(jīng)常有香客問我嘲叔,道長,這世上最難降的妖魔是什么抽活? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任硫戈,我火速辦了婚禮,結(jié)果婚禮上下硕,老公的妹妹穿的比我還像新娘丁逝。我一直安慰自己,他們只是感情好梭姓,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布霜幼。 她就那樣靜靜地躺著,像睡著了一般誉尖。 火紅的嫁衣襯著肌膚如雪罪既。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天铡恕,我揣著相機與錄音琢感,去河邊找鬼。 笑死探熔,一個胖子當著我的面吹牛驹针,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诀艰,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼柬甥,長吁一口氣:“原來是場噩夢啊……” “哼饮六!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暗甥,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤喜滨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撤防,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虽风,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年寄月,在試婚紗的時候發(fā)現(xiàn)自己被綠了辜膝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡漾肮,死狀恐怖厂抖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情克懊,我是刑警寧澤忱辅,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站谭溉,受9級特大地震影響墙懂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扮念,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一损搬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柜与,春花似錦巧勤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粘茄,卻和暖如春签舞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柒瓣。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工儒搭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芙贫。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓搂鲫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親磺平。 傳聞我的和親對象是個殘疾皇子魂仍,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

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