handler通訊機制

2021-06-29 05:33:54 字數 1187 閱讀 1210

android應用開發有個預設規則,不在ui執行緒做耗時操作。耗時操作結果反饋給使用者也不能直接更新ui。

耗時操作必須開子執行緒去做,實現的方式很多,handler、asynctask、service。。。每個人偏好不同,但是各有各的優點,根據不同的需求選擇適當的實現方式,是我一直追求的目標,每一種至少要會用,用的多了就會去想,去理解。

關於handler,剛開始用的時候有些難以理解,跟他繞在一起的message、looper、thread還有messagequeue,這麼久了,有點明白了,他們的關係大概是這樣的:

每乙個執行緒想要通過handler來通訊,首先要有乙個looper,looper與執行緒是1:1的,可以沒有,但是最多只有乙個。looper,底層的原始碼在例項化的時候,給自己例項化了乙個messagequeue,所以它倆也是1:1,相當於messagequeue繫結在looper內部的。有了這兩個,還得有乙個handler,用來接收和傳送message,這樣結構就搭建好了。

當產生執行緒間通訊的需要了,先new 乙個message或者handler.obtainmessage(),將資訊裝載進message,給message設定一些屬性(比方說target),然後用handler扔給looper,looper一直輪詢的讀取自己的messagequeue,有就讀出來處理掉,沒有就阻塞等待,當looper,讀取到了message,就將他交給相應的handler,handler有個基本上必須覆蓋的方法handlemessage(),用來處理message身上的資訊,完成了不同執行緒之間的通訊。

總結幾點:

1、ui執行緒(主線程)也遵循必須有looper的條件,不過是因為系統隱式的建立好了,所以**中沒有體現;

2、thread:looper == 1:1(可以沒有,最多乙個),looper:messagequeue == 1:1(有且僅有乙個),messagequeue:message == 1:n(數量任意),message:handler == n:1(反正我是沒用過乙個message可以發個多個handler)

,handler:looper == n:n(他們之間好像沒什麼關係,有關係的是message)。

3、message通過target和callback來確定將要去的handler,不管來的handler,其中callback優先於target。

handler程序間通訊機制

handler在哪個activity或者service執行緒建立,那麼looper就和哪乙個執行緒進行了繫結。如果是自己建立的執行緒那麼就要使用looper中的prepare函式來繫結了。在handler建立後就例項化了乙個looper並關聯了乙個訊息佇列mq。在其他的傳送訊息的執行緒中 接受執行緒...

Handler機制概要

簡而言之,每個thread裡面有looper 通過prepare初始化,通過loop進入死迴圈 每個handler將自己的msg放入looper死迴圈裡面,然後looper迴圈檢測訊息再傳送回給handler。記憶體洩漏問題 這裡需要注意乙個記憶體洩漏問題,就是當activity退出的時候會出現記憶...

Handler機制整理

handler機制整理 目錄介紹 1.關於handler訊息機制圖 2.關於handler基本介紹 3.使用handler的幾種方法 4.關於handler底層原始碼解讀 1.關於handler訊息機制圖 2.關於handler機制基本解讀 message 訊息,其中包含了訊息id,訊息處理物件以及...