handler的原理小結(jié)

by hzwusibo? 20190504


handler的原理驻啤, loop怎么與handler進(jìn)行綁定https://blog.csdn.net/lqb3732842/article/details/54947159handler獲取當(dāng)前線程中的looper對(duì)象狭莱,looper用來從存放Message的MessageQueue中取出Message姨裸,再有handler進(jìn)行Message的分發(fā)與處理盗飒。

https://blog.csdn.net/lmj623565791/article/details/38377229Handler的創(chuàng)建流程

1、首先Looper.prepare()在本線程中保存一個(gè)Looper實(shí)例,然后該實(shí)例中保存一個(gè)MessageQueue對(duì)象喝峦;因?yàn)長ooper.prepare()在一個(gè)線程中只能調(diào)用一次饵撑,所以MessageQueue在一個(gè)線程中只會(huì)存在一個(gè)剑梳。

2唆貌、Looper.loop()會(huì)讓當(dāng)前線程進(jìn)入一個(gè)無限循環(huán),不端從MessageQueue的實(shí)例中讀取消息垢乙,然后回調(diào)msg.target.dispatchMessage(msg)方法锨咙。

3、Handler的構(gòu)造方法追逮,會(huì)首先得到當(dāng)前線程中保存的Looper實(shí)例酪刀,進(jìn)而與Looper實(shí)例中的MessageQueue想關(guān)聯(lián)。

4羊壹、Handler的sendMessage方法蓖宦,會(huì)給msg的target賦值為handler自身,然后加入MessageQueue中油猫。

5稠茂、在構(gòu)造Handler實(shí)例時(shí),我們會(huì)重寫handleMessage方法情妖,也就是msg.target.dispatchMessage(msg)最終調(diào)用的方法睬关。

那么在Activity中,我們并沒有顯示的調(diào)用Looper.prepare()和Looper.loop()方法, 為啥Handler可以成功創(chuàng)建呢毡证?

因?yàn)樵贏ctivity的啟動(dòng)代碼中电爹,已經(jīng)在當(dāng)前UI線程調(diào)用了Looper.prepare()和Looper.loop()方法。

loop自循環(huán)為什么不會(huì)阻塞

https://blog.csdn.net/u013435893/article/details/50903082

Android是事件驅(qū)動(dòng)料睛,Looper內(nèi)部是一個(gè)while死循華丐箩,只有程序退出后循環(huán)才會(huì)停止,如果Looper使用中死掉了恤煞,任何事件都不會(huì)有反應(yīng)了屎勘。事件只會(huì)阻塞Looper,而Looper不會(huì)阻塞事件居扒。

ActivityThread 有個(gè) getHandler 方法概漱,得到這個(gè) handler 就可以發(fā)送消息,然后 loop 里就分發(fā)消息喜喂,然后就發(fā)給 handler, 然后就執(zhí)行到 H(Handler )里的對(duì)應(yīng)代碼瓤摧。所以這些代碼就不會(huì)卡死~,有消息過來就能執(zhí)行玉吁。舉個(gè)例子照弥,在 ActivityThread 里的內(nèi)部類 ApplicationThread 中就有很多 sendMessage 的方法。

簡單的來說:

ActivityThread的main方法主要就是做消息循環(huán)进副,一旦退出消息循環(huán)产喉,那么你的程序也就可以退出了。

從消息隊(duì)列中取消息可能會(huì)阻塞,取到消息會(huì)做出相應(yīng)的處理曾沈。如果某個(gè)消息處理時(shí)間過長这嚣,就可能會(huì)影響UI線程的刷新速率,造成卡頓的現(xiàn)象塞俱。

主要原因有2個(gè)

1姐帚、epoll模型 當(dāng)沒有消息的時(shí)候會(huì)epoll.wait,等待句柄寫的時(shí)候再喚醒障涯,? 主線程大多數(shù)時(shí)候都是處于休眠狀態(tài)罐旗,并不會(huì)消耗大量CPU資源。

2唯蝶、所有的ui操作都通過handler來發(fā)消息操作九秀。 比如屏幕刷新16ms一個(gè)消息,你的各種點(diǎn)擊事件粘我,所以就會(huì)有句柄寫操作鼓蜒,喚醒上文的wait操作,所以不會(huì)被卡死了征字。

主線程的死循環(huán)一直運(yùn)行是不是特別消耗CPU資源呢都弹? 這里涉及到Linux pipe/epoll機(jī)制,簡單說就是在主線程的MessageQueue沒有消息時(shí)匙姜,便阻塞在loop的queue.next()中的nativePollOnce()方法畅厢,此時(shí)主線程會(huì)釋放CPU資源進(jìn)入休眠狀態(tài),直到下個(gè)消息到達(dá)或者有事務(wù)發(fā)生氮昧,通過往pipe管道寫端寫入數(shù)據(jù)來喚醒主線程工作框杜。這里采用的epoll機(jī)制,是一種IO多路復(fù)用機(jī)制袖肥,可以同時(shí)監(jiān)控多個(gè)描述符咪辱,當(dāng)某個(gè)描述符就緒(讀或?qū)懢途w),則立刻通知相應(yīng)程序進(jìn)行讀或?qū)懖僮髡焉欤举|(zhì)同步I/O梧乘,即讀寫是阻塞的澎迎。 所以說庐杨,主線程大多數(shù)時(shí)候都是處于休眠狀態(tài),并不會(huì)消耗大量CPU資源夹供。

https://www.zhihu.com/question/34652589

子線程和子線程之間的通信

https://blog.csdn.net/yi412/article/details/64929399

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灵份,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哮洽,更是在濱河造成了極大的恐慌填渠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氛什,居然都是意外死亡莺葫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門枪眉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捺檬,“玉大人,你說我怎么就攤上這事贸铜”の常” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵蒿秦,是天一觀的道長烤镐。 經(jīng)常有香客問我,道長棍鳖,這世上最難降的妖魔是什么炮叶? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮鹊杖,結(jié)果婚禮上悴灵,老公的妹妹穿的比我還像新娘。我一直安慰自己骂蓖,他們只是感情好积瞒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著登下,像睡著了一般茫孔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上被芳,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天缰贝,我揣著相機(jī)與錄音,去河邊找鬼畔濒。 笑死剩晴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侵状。 我是一名探鬼主播赞弥,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼趣兄!你這毒婦竟也來了绽左?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤艇潭,失蹤者是張志新(化名)和其女友劉穎拼窥,沒想到半個(gè)月后戏蔑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲁纠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年总棵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片改含。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彻舰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出候味,到底是詐尸還是另有隱情刃唤,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布白群,位于F島的核電站尚胞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帜慢。R本人自食惡果不足惜笼裳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粱玲。 院中可真熱鬧躬柬,春花似錦、人聲如沸抽减。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卵沉。三九已至颠锉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間史汗,已是汗流浹背琼掠。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留停撞,地道東北人瓷蛙。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像戈毒,于是被迫代替她去往敵國和親艰猬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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