Android Handler原理

1锭亏、看看handler的構(gòu)造方法:


image.png

在構(gòu)造方法里獲取了mLooper 和一個mQueue粘捎,可以明確看出如果looper為空的話就會拋一個runtime異常拉队,讓我們先去調(diào)用Looper.prepare()方法
然后看看Looper.myLooper做了什么事:


image.png

這是looper.myLooper的實(shí)現(xiàn)就是以currentThread為鍵,去ThreadLocalMap里找到相應(yīng)的looper诲泌。
再看看looper.prepare做了什么:
image.png

image.png

prepare方法就是將當(dāng)前l(fā)ooper和當(dāng)前線程放入threadLocal中去妻坝。
在這里思考一個問題:
是否可以在主線程中new一個looper伸眶?
獲取looper的方式就是looper.prepare,在主線程中調(diào)用會拋異常new RuntimeException("Only one Looper may be created per thread");

2、當(dāng)調(diào)用handler.sendMessage時:


image.png

會調(diào)用enqueueMessage這個方法將message的target 和uid指定為當(dāng)前handle 并且加入隊列刽宪。

再然后調(diào)用Looper.loop方法,厘贼,開啟無線循環(huán)模式,去不斷獲取messageQueue中的message并且調(diào)用message.target.dispatchMessage方法去處理message圣拄。
這個時候就涉及另外一個問題:
Looper的死循環(huán)為何不會卡死嘴秸。這里就涉及到了linux的epoll機(jī)制,簡單說就是在主線程的MessageQueue沒有消息時庇谆,便阻塞在loop的queue.next()中的nativePollOnce()方法里岳掐。<meta charset="utf-8">

此時主線程會釋放CPU資源進(jìn)入休眠狀態(tài),直到下個消息到達(dá)或者有事務(wù)發(fā)生饭耳,通過往pipe管道寫端寫入數(shù)據(jù)來喚醒主線程工作串述。這里采用的epoll機(jī)制,是一種IO多路復(fù)用機(jī)制寞肖,可以同時監(jiān)控多個[描述符]當(dāng)某個描述符就緒(讀或?qū)懢途w)纲酗,則立刻通知相應(yīng)程序進(jìn)行讀或?qū)懖僮魉ル纾举|(zhì)同步I/O,即讀寫是阻塞的觅赊。主線程大多數(shù)時候都是處于休眠狀態(tài)右蕊,并不會消耗大量CPU資源。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茉兰,一起剝皮案震驚了整個濱河市尤泽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌规脸,老刑警劉巖坯约,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異莫鸭,居然都是意外死亡闹丐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門被因,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卿拴,“玉大人,你說我怎么就攤上這事梨与《榛ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵粥鞋,是天一觀的道長缘挽。 經(jīng)常有香客問我,道長呻粹,這世上最難降的妖魔是什么壕曼? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮等浊,結(jié)果婚禮上腮郊,老公的妹妹穿的比我還像新娘。我一直安慰自己筹燕,他們只是感情好轧飞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撒踪,像睡著了一般踪少。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糠涛,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天援奢,我揣著相機(jī)與錄音,去河邊找鬼忍捡。 笑死集漾,一個胖子當(dāng)著我的面吹牛切黔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播具篇,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼纬霞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驱显?” 一聲冷哼從身側(cè)響起诗芜,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎埃疫,沒想到半個月后伏恐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栓霜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年翠桦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胳蛮。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡销凑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仅炊,到底是詐尸還是另有隱情斗幼,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布抚垄,位于F島的核電站孟岛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏督勺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一斤贰、第九天 我趴在偏房一處隱蔽的房頂上張望智哀。 院中可真熱鬧,春花似錦荧恍、人聲如沸瓷叫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摹菠。三九已至,卻和暖如春骗爆,著一層夾襖步出監(jiān)牢的瞬間次氨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工摘投, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煮寡,地道東北人虹蓄。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像幸撕,于是被迫代替她去往敵國和親薇组。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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