【多線程通信】消息機(jī)制Handler

Handler的工作原理(消息機(jī)制)《開發(fā)藝術(shù)探索》

消息處理包括消息的發(fā)送與接收腮猖,發(fā)送分為send和post税稼,而post本質(zhì)是由send實現(xiàn)的胆胰。

發(fā)送過程:

  1. 當(dāng)handler.sendMessage后奈附,MessageQueue的enqueueMessage會將消息入隊;
  2. MessageQueue的next()會將消息返回給Looper的loop()
  3. handler.dispatchMessage對消息進(jìn)行處理

處理過程:

  1. 先檢查是否為post(通過msg.callback)
  2. 不是則判斷handler初始化是否傳入callback
  3. 沒有或處理失敗交由重寫的handleMessage處理

ThreadLocal(泛型)類

它是一個線程內(nèi)部的數(shù)據(jù)存儲類煮剧,通過它可以再指定線程中存取數(shù)據(jù),它是handler能獲取當(dāng)前線程Looper的關(guān)鍵。雖然在不同線程中訪問的是同一個ThreadLocal對象(Looper類中有一個靜態(tài)最終變量sThreadLocal勉盅,記錄每個線程對應(yīng)的Looper)佑颇,卻會獲得不一樣的值,這是因為真正存東西的是ThreadLocal類的靜態(tài)內(nèi)部類ThreadLocalMap草娜,它的內(nèi)部還有個內(nèi)部類Entry建立了ThreadLocal實例和泛型的Map關(guān)系挑胸。ThreadLocal的set和get都是對Thread中的ThreadLocalMap變量的操作。像一種結(jié)構(gòu)型的設(shè)計模式宰闰,外觀模式茬贵。

Looper工作原理

它會不斷地從MessageQueue中查看是否有新消息,有則立即處理移袍,沒有則阻塞解藻。它在創(chuàng)建時會同時創(chuàng)建MessageQueue并保存當(dāng)前thread信息。Looper.loop()在MessageQueue的next不返回消息而一直阻塞葡盗,若有返回則調(diào)用msg.target.dispatchMessage(msg)來處理消息螟左,這里的dispatchMessage是在創(chuàng)建Hnadler時所使用的Looper中執(zhí)行的,因此將處理過程切換到了指定的線程觅够。(其中msg.target為發(fā)送它的handler)

MessageQueue原理

主要包括兩個操作:插入和讀取胶背,分別對應(yīng)enqueueMessage和next方法,enqueueMessage是向消息隊列中插入一條信息喘先。next方法是一個循環(huán)钳吟,若隊列中沒有消息,next方法會一直阻塞窘拯;當(dāng)有新消息時红且,next會返回這條消息并從隊列中移除它

線程工具

Thread和Runnable

AsyncTack

HandlerThread

1、HandlerThread產(chǎn)生背景

當(dāng)系統(tǒng)有多個耗時任務(wù)需要執(zhí)行時树枫,每個任務(wù)都會開啟一個新線程去執(zhí)行耗時任務(wù)直焙,這樣會導(dǎo)致系統(tǒng)多次創(chuàng)建和銷毀線程,從而影響性能砂轻。為了解決這一問題奔誓,Google提供了HandlerThread,HandlerThread是在線程中創(chuàng)建一個Looper循環(huán)器搔涝,讓Looper輪詢消息隊列厨喂,當(dāng)有耗時任務(wù)進(jìn)入隊列時,則不需要開啟新線程庄呈,在原有的線程中執(zhí)行耗時任務(wù)即可蜕煌,否則線程阻塞

2、HanlderThread的特點诬留、

HandlerThread本質(zhì)上是一個線程斜纪,繼承自Thread
HandlerThread有自己的Looper對象贫母,可以進(jìn)行Looper循環(huán),可以創(chuàng)建Handler
HandlerThread可以在Handler的handlerMessage中執(zhí)行異步方法
HandlerThread優(yōu)點是異步不會堵塞盒刚,減少對性能的消耗
HandlerThread缺點是不能同時繼續(xù)進(jìn)行多任務(wù)處理腺劣,需要等待進(jìn)行處理,處理效率較低
HandlerThread與線程池不同因块,HandlerThread是一個串行隊列橘原,背后只有一個線程

IntentService

1、IntentService是什么

IntentService是繼承自Service并處理異步請求的一個類涡上,其內(nèi)部采用HandlerThread和Handler實現(xiàn)的趾断,在IntentService內(nèi)有一個工作線程來處理耗時操作,其優(yōu)先級比普通Service高吩愧。當(dāng)任務(wù)完成后芋酌,IntentService會自動停止,而不需要手動調(diào)用stopSelf()耻警。另外隔嫡,可以多次啟動IntentService,每個耗時操作都會以工作隊列的方式在IntentService中onHandlerIntent()回調(diào)方法中執(zhí)行甘穿,并且每次只會執(zhí)行一個工作線程

2腮恩、IntentService使用方法

創(chuàng)建Service繼承自IntentService
覆寫構(gòu)造方法和onHandlerIntent()方法
在onHandlerIntent()中執(zhí)行耗時操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市温兼,隨后出現(xiàn)的幾起案子秸滴,更是在濱河造成了極大的恐慌,老刑警劉巖募判,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荡含,死亡現(xiàn)場離奇詭異,居然都是意外死亡届垫,警方通過查閱死者的電腦和手機(jī)释液,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來装处,“玉大人误债,你說我怎么就攤上這事⊥ǎ” “怎么了寝蹈?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長登淘。 經(jīng)常有香客問我箫老,道長,這世上最難降的妖魔是什么黔州? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任耍鬓,我火速辦了婚禮阔籽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牲蜀。我一直安慰自己仿耽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布各薇。 她就那樣靜靜地躺著,像睡著了一般君躺。 火紅的嫁衣襯著肌膚如雪峭判。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天棕叫,我揣著相機(jī)與錄音林螃,去河邊找鬼。 笑死俺泣,一個胖子當(dāng)著我的面吹牛疗认,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伏钠,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼横漏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熟掂?” 一聲冷哼從身側(cè)響起缎浇,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赴肚,沒想到半個月后素跺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡誉券,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年指厌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踊跟。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡踩验,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琴锭,到底是詐尸還是另有隱情晰甚,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布决帖,位于F島的核電站厕九,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏地回。R本人自食惡果不足惜扁远,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一俊鱼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畅买,春花似錦并闲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至湃缎,卻和暖如春犀填,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗓违。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工九巡, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹂季。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓冕广,卻偏偏與公主長得像,于是被迫代替她去往敵國和親偿洁。 傳聞我的和親對象是個殘疾皇子撒汉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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