Handler原理

Handler是android子線程和主線程之間通信的一種機(jī)制。

主要包含四個(gè)類handler? looper? messagequeue? message

handler作用?

用來(lái)發(fā)送和處理消息的。

一個(gè)線程中多個(gè)handler發(fā)消息處理消息為什么不混亂?:

message.target = handler(當(dāng)前發(fā)消息的handler)

Looper作用?:

通過(guò)loop(for死循環(huán))查看當(dāng)前的消息鏈表中是否有需要處理的message。

MessageQueue作用?

MessageQueue 存在的原因很簡(jiǎn)單,就是同一線程在同一時(shí)間只能處理一個(gè)消息,同一線程代碼執(zhí)行是不具有并發(fā)性,所以需要隊(duì)列來(lái)保存消息和安排每個(gè)消息的處理順序。多個(gè)其他線程往UI線程發(fā)送消息,UI線程必須把這些消息保持到一個(gè)列表(它同一時(shí)間不能處理那么多任務(wù)),然后挨個(gè)拿出來(lái)處理,這種設(shè)計(jì)很簡(jiǎn)單,我們平時(shí)寫(xiě)代碼其實(shí)也經(jīng)常這么做。每一個(gè)Looper線程都會(huì)維護(hù)這樣一個(gè)隊(duì)列,而且僅此一個(gè),這個(gè)隊(duì)列的消息只能由該線程處理。

用來(lái)存儲(chǔ)message的鏈表(鏈表中的消息message是按when(當(dāng)前系統(tǒng)的時(shí)間戳)從小到大的排列)。

Message作用?:

用來(lái)存儲(chǔ)消息內(nèi)容

如何把Handler,Looper,MessageQueue,Message串起來(lái)?

通過(guò)handler.sendMessage這個(gè)方法,把當(dāng)前的消息對(duì)象message傳入到handler中,通過(guò)handler中的messagequeue對(duì)象的引用,把Message放入到MessageQueue中。

在message存放的時(shí)候,message對(duì)象的target屬性記錄了當(dāng)前的handler。message通過(guò)消息的執(zhí)行時(shí)間when,從小到大排列插入到消息鏈表中。

我們looper的loop方法中的for(死循環(huán))去查看當(dāng)前的MessageQueue鏈表中是否有需要執(zhí)行的Message。通過(guò)Message的when(消息的執(zhí)行時(shí)間判斷)和當(dāng)前的系統(tǒng)時(shí)間戳做對(duì)比,如果當(dāng)前的系統(tǒng)時(shí)間戳小于當(dāng)前messagequeue鏈表中的消息執(zhí)行時(shí)間,當(dāng)前的執(zhí)行進(jìn)入等待狀態(tài)。如果當(dāng)前的系統(tǒng)時(shí)間戳大于或等于當(dāng)前的MessageQueue鏈表中的消息執(zhí)行時(shí)間,我們就把當(dāng)前的message從消息鏈表中刪除,并且把該消息返回給Looper的loop方法中。

在loop方法中獲取到message以后判斷message所對(duì)應(yīng)的target是否存在,如果存在就調(diào)用target.dispathMessage方法把當(dāng)前的message傳入,在dispathMessage方法中,我們將調(diào)用handleMessage這個(gè)方法。把當(dāng)前取出的message傳出去。這樣在我們handler中重寫(xiě)的handleMessage就拿到了當(dāng)前處理的消息。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.handler基本信息: 定義:一套 Android 消息傳遞機(jī)制。 作用:在多線程的應(yīng)用場(chǎng)景中,將工作線程中...
    夢(mèng)源坦閱讀 661評(píng)論 0 0
  • Handler是android子線程和主線程之間通信的一種機(jī)制。主要包含四個(gè)類handler looper m...
    殘非閱讀 194評(píng)論 0 0
  • Handler 原理 一、Handler消息發(fā)送機(jī)制 1. 發(fā)送消息 1.1 添加消息 調(diào)用Handler.sen...
    還是昵稱啊閱讀 279評(píng)論 0 0
  • 我的簡(jiǎn)書(shū):http://www.itdecent.cn/u/c91e642c4d90我的CSDN:http://...
    在代碼下成長(zhǎng)閱讀 791評(píng)論 2 0
  • 在Android中,只有主線程才能更新UI,但是主線程不能進(jìn)行耗時(shí)操作,否則會(huì)產(chǎn)生ANR異常,所以常常把耗時(shí)操作放...
    雷濤賽文閱讀 1,137評(píng)論 1 2

友情鏈接更多精彩內(nèi)容