Android消息機(jī)制分析

引言:

  • Android應(yīng)用啟動時汽抚,會默認(rèn)有一個主線程(ui線程)奶陈,在這個線程中會關(guān)聯(lián)一個消息隊(duì)列(MessageQueue),所有的操作都會被封裝成消息(Message)然后交給主線程處理 ,為了保證主線程不會主動退出易阳,會將消息的操作放在一個死循環(huán)中煤杀,這樣程序就相當(dāng)于一直在執(zhí)行死循環(huán)钮追,因此不會退出晃财。
  • 對于主線程來說,會自動綁定一個消息循環(huán)looper,查看源碼建炫,如圖畦韭,主線程的消息循環(huán)在main方法(android程序的入口)中已經(jīng)被創(chuàng)建。
    ActivityThread.main方法執(zhí)行完肛跌,應(yīng)用程序就啟動了艺配,系統(tǒng)將消息投遞到消息隊(duì)列中据过,又會從消息隊(duì)列中獲取消息并且處理消息,而這一切Handler
    起著重要的作用~


    image.png

重點(diǎn)理解:

  • 在主線程中創(chuàng)建妒挎,我們經(jīng)常會遇到的一個問題就是更新ui,大家都應(yīng)該知道在子線程是不能更新UI的西饵,所以我們最常見的使用手段就是通過handler將消息send回主線程酝掩,handler再通過handleMessage方法在主線程進(jìn)行處理。
class MyHandler extends Handler{
  @Override
public void handleMessage(Message msg){
//更新ui---主線程
}
}
MyHandler mHandler=new MyHandler();
//新線程
new Thread(){
public void run(){
//耗時操作
mHandler.sendEmptyMessage(123); 
}
}.start();
  • Handler就是一個消息處理器眷柔,將消息投遞給消息隊(duì)列期虾,然后再由對應(yīng)的線程從消息隊(duì)列中逐個取出消息。
  • 消息隊(duì)列是通過Looper與線程關(guān)聯(lián)

Handler的構(gòu)造函數(shù)中獲取looper驯嘱,與looper綁定镶苞,而queue封裝在looper中,通過mQueue=mLooper.mQueue鞠评;//即可獲得消息隊(duì)列
prepareMainLooper()這個方法調(diào)用prepare(這個方法中創(chuàng)建了一個looper對象)茂蚓,而prepareMainLooper()是為ui線程設(shè)置對應(yīng)的looper,這樣looper就與線程關(guān)聯(lián)上了剃幌,同理消息隊(duì)列也與線程關(guān)聯(lián)聋涨。handler也與線程關(guān)聯(lián)。

  • 每一個handler都會關(guān)聯(lián)一個消息隊(duì)列负乡,handler與looper綁定牍白,而消息隊(duì)列被封裝在looper中,每一個looper又會關(guān)聯(lián)一個線程抖棘,他們之間的關(guān)系是Handler(N):Looper(1):MeaasgeQueue(1):Thread(1)
  • 對應(yīng)looper:有兩個重要的點(diǎn):
    Looper.prepare();//創(chuàng)建looper對象
    looper獲得后茂腥,通過Looper.loop()執(zhí)行消息循環(huán)
  • 過程敘述
    • 實(shí)例化looper:如果handler在主線程創(chuàng)建,那么主線程會默認(rèn)與其綁定一個looper和與之對應(yīng)的消息隊(duì)列切省,不用實(shí)例化looper最岗;而如果handler在子線程創(chuàng)建,android系統(tǒng)默認(rèn)情況下非主線程是沒有開啟looper的数尿,所以需要我們手動初始化looper:Looper.prepare();
    • 實(shí)例化Handler handler=new Handler();
    • 執(zhí)行消息循環(huán):Looper.loop()仑性。
    • 實(shí)例化Message:有兩種消息類型(message,runnable)右蹦,通過handler的sendMessage(message)和post(runnable)發(fā)送消息诊杆。然后將消息壓入到消息隊(duì)列中。
    • Looper輪詢消息何陆,并調(diào)用handler.handleMeaasge()來讓handler處理消息晨汹。


      關(guān)系如圖.png

      根據(jù)上圖可以總結(jié)一個結(jié)論:
      android中通過Handler機(jī)制來異步處理多線程之間的通信,就是多個線程之間共享一個MessageQueue

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贷盲,一起剝皮案震驚了整個濱河市淘这,隨后出現(xiàn)的幾起案子剥扣,更是在濱河造成了極大的恐慌,老刑警劉巖铝穷,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钠怯,死亡現(xiàn)場離奇詭異,居然都是意外死亡曙聂,警方通過查閱死者的電腦和手機(jī)晦炊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宁脊,“玉大人断国,你說我怎么就攤上這事∮馨” “怎么了稳衬?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坐漏。 經(jīng)常有香客問我薄疚,道長,這世上最難降的妖魔是什么赊琳? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任输涕,我火速辦了婚禮,結(jié)果婚禮上慨畸,老公的妹妹穿的比我還像新娘莱坎。我一直安慰自己,他們只是感情好寸士,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布檐什。 她就那樣靜靜地躺著,像睡著了一般弱卡。 火紅的嫁衣襯著肌膚如雪乃正。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天婶博,我揣著相機(jī)與錄音瓮具,去河邊找鬼。 笑死凡人,一個胖子當(dāng)著我的面吹牛名党,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挠轴,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼传睹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了岸晦?” 一聲冷哼從身側(cè)響起欧啤,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤睛藻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后邢隧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體店印,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年倒慧,在試婚紗的時候發(fā)現(xiàn)自己被綠了吱窝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡迫靖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兴使,到底是詐尸還是另有隱情系宜,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布发魄,位于F島的核電站盹牧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏励幼。R本人自食惡果不足惜汰寓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苹粟。 院中可真熱鬧有滑,春花似錦、人聲如沸嵌削。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苛秕。三九已至肌访,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艇劫,已是汗流浹背吼驶。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留店煞,地道東北人蟹演。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像顷蟀,于是被迫代替她去往敵國和親轨帜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

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