第10章 Android的消息機制

ThreadLocal的工作原理

所操作的對象都是當(dāng)前線程的localValues對象的table數(shù)組表窘,因此在不同線程中訪問同一個ThreadLocal的set和get方法,他們所做的讀寫操作僅限于各自線程的內(nèi)部城看,這就是為什么ThreadLocal可以在多個線程中互不干擾的存儲和修改數(shù)據(jù),理解ThreadLocal的實現(xiàn)方式由于與理解Looper的工作原理

10.2.2 消息隊列的工作原理

消息隊列在Android中指的是MessageQueue杏慰,MessageQueue主要包含兩個操作:插入和讀取测柠。讀取操作本身會伴隨著刪除操作,插入和讀取對應(yīng)的方法分別是enqueueMessage和next缘滥,其中enqueueMessage的作用是往消息隊列中插入一條消息轰胁,而next的作用是從消息隊列中取出一條消息并將它從消息隊列中移除,盡管messageQueue叫做消息隊列朝扼,但是他的內(nèi)部實現(xiàn)并不是用的隊列赃阀,而是單鏈表,單鏈表在插入和刪除上比較有優(yōu)勢擎颖。

從enqueueMessage中的實現(xiàn)來看榛斯,他的主要操作其實就是單鏈表的插入操作。
next方法是一個無限循環(huán)的方法肠仪,如果消息隊列沒有消息,那么next方法會一直阻塞在這個备典,那么當(dāng)新消息到來時异旧,next方法會返回這條消息并將其從單鏈表中移除

10.2.3 Looper的工作原理

Looper的loop方法的工作過程比較好理解,loop方法是一個死循環(huán)提佣,唯一跳出循環(huán)的方式是MessageQueue的next方法返回了null吮蛹。當(dāng)Looper的quit方法被調(diào)用時荤崇,Looper會調(diào)用MessageQueue的quite或者quitSafeley方法來通知消息隊列退出,當(dāng)消息隊列被標(biāo)記為退出狀態(tài)時潮针,他的next方法會返回null术荤。也就是說,Looper必須退出每篷,否則Loop方法就會無限循環(huán)下去瓣戚。loop方法會調(diào)用MessageQueue的next方法獲取新消息,而next是一個阻塞操作焦读,當(dāng)沒有消息時子库,next方法會一直阻塞在哪里,這也導(dǎo)致loop方法一直阻塞在哪里矗晃。如果MessageQueue的next方法返回了新消息仑嗅,Looper就會處理這條消息:msg.target.dispatchMessage(msg),這里的msg.target是發(fā)送這條消息的handler對象。這樣handler發(fā)送的消息最終又交給了它的dispatchMessage方法來處理了张症。但是這里不同的是仓技,Handler的dispatchMessage方法是在創(chuàng)建handler時所使用的Looper中執(zhí)行的。這樣就成功的將代碼切換到了指定的線程中去了

10.2.4 Handler的工作原理

Handler發(fā)送消息的過程僅僅是像消息隊列中插入了一條信息俗他,MessageQueue的next方法就會返回這條消息給Looper脖捻,Looper收到消息后就開始處理了。最終消息由Looper交由給handler處理拯辙,既handler的dispatchMessage方法會被調(diào)用郭变,這時候handler就會進入了處理消息的階段。

handler的處理消息的過程如下:
首先檢查message的callback是否為null,不為null就通過handleCallback來處理消息涯保。Message的callback是一個Runnable對象诉濒,實際上就是Handler的post方法所傳遞的Runnable參數(shù)。其次檢查mCallback是否為null夕春,不為null就調(diào)用mCallback的handleMessage方法來處理消息未荒。最后調(diào)用handler的handleMessage方法來處理消息。

10.3主線程的消息輪詢

android的主線程就是ActivityThread及志,主線程的入口方法為main片排,在main方法中系統(tǒng)會通過Looper.preparemainLooper()來創(chuàng)建主線程的Looper以及MessageQueue,并通過Looper.loop()來開啟主線程的消息循環(huán)速侈。

主線程的消息循環(huán)開始了以后率寡,ActivityThread還需要一個handler和消息隊列進行交互,這個handler就是ActivityThread.H ,他內(nèi)部定義了一組消息類型倚搬,主要包含了四大組件的啟動和停止等過程

ActivityThread通過ApplicationThread和AMS進行進程間通信冶共,AMS以進程間通信的方式完成ActivityThread的請求后會回調(diào)ApplicationThread中的Binder方法,然后ApplicationThread會像H發(fā)送消息,H收到消息后會將ApplicationThread中的邏輯切換到ActivityThread中去執(zhí)行捅僵,既切換到主線程中去執(zhí)行家卖,這個過程是主線程的消息循環(huán)模型。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庙楚,一起剝皮案震驚了整個濱河市上荡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馒闷,老刑警劉巖酪捡,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窜司,居然都是意外死亡沛善,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門塞祈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來金刁,“玉大人,你說我怎么就攤上這事议薪∮嚷” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵斯议,是天一觀的道長产捞。 經(jīng)常有香客問我,道長哼御,這世上最難降的妖魔是什么坯临? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮恋昼,結(jié)果婚禮上看靠,老公的妹妹穿的比我還像新娘。我一直安慰自己液肌,他們只是感情好挟炬,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嗦哆,像睡著了一般谤祖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上老速,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天粥喜,我揣著相機與錄音,去河邊找鬼橘券。 笑死额湘,一個胖子當(dāng)著我的面吹牛秕铛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缩挑,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鬓梅!你這毒婦竟也來了供置?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤绽快,失蹤者是張志新(化名)和其女友劉穎芥丧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坊罢,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡续担,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了活孩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片物遇。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖憾儒,靈堂內(nèi)的尸體忽然破棺而出询兴,到底是詐尸還是另有隱情,我是刑警寧澤起趾,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布诗舰,位于F島的核電站,受9級特大地震影響训裆,放射性物質(zhì)發(fā)生泄漏眶根。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一边琉、第九天 我趴在偏房一處隱蔽的房頂上張望属百。 院中可真熱鬧,春花似錦艺骂、人聲如沸诸老。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽别伏。三九已至,卻和暖如春忧额,著一層夾襖步出監(jiān)牢的瞬間厘肮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工睦番, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留类茂,地道東北人耍属。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像巩检,于是被迫代替她去往敵國和親厚骗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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