Handler原始碼解析

2021-07-13 05:22:04 字數 2097 閱讀 4598

意思就是說:在沒有呼叫looper.prepare()之前不能在子執行緒建立handler。

為什麼在主線程中我們就已經可以直接建立handler?

因為在activity的啟動**中,已經在當前ui執行緒(主線程)呼叫了looper.preparemainlooper()和looper.loop()方法。我們可以在原始碼的activitythread類中看到,如圖:

從上圖可以看出,在主線程中首先呼叫的是looper.preparemainlooper(),然後建立了乙個activitythread例項,最後通過looper類使主線程進入訊息迴圈中。

如果在子執行緒中使用handler,必須要呼叫loop.prepare()和looper.loop()方法。

那這2個方法到底做了哪些事呢?

首先說looper.prepare()

在呼叫 looper.prepare() 方法時,建立乙個 looper 物件,這個物件是被 set 繫結到乙個threadlocal(執行緒區域性變數)中。

sthreadlocal.set(new looper(quitallowed));  threadlocal的作用就是保證每乙個呼叫了prepare()函式的執行緒裡面都有乙個唯一的looper物件。

而new looper(quitallowed)方法實際上也建立了訊息佇列messagequeue,如下圖:

再來說looper.loop()

以下還有剩餘未截全的,承接上面的

可以看出,這個方法就是不斷從訊息佇列(messagequeue)中取出訊息,再呼叫handler.dispatchmessage()分發訊息,如下圖:

這個handlemessage方法就是我們使用handler時,經常重寫的方法。

當然有些人說,在loop.loop()方法中msg.target.dispatchmessage(msg),你怎麼確定是handler的dispatchmessage方法呢?好吧,讓你看下message類中成員變數,如下圖:

最後,有人會問,訊息(message)既然是從訊息佇列(messagequeue)中取出來的,那訊息(message)是從哪進入訊息佇列(messagequeue)的呢?

如下一**:

直到最後一張圖才看到,queue.enqueuemessage(msg, uptimemillis);這就是訊息進入訊息佇列的方法。

不管handler呼叫哪個方法傳送訊息,最終都會呼叫queue.enqueuemessage(msg, uptimemillis);

Handler原始碼解析2

handler原始碼解析1 handler原始碼解析2 享元設計模式 記憶體復用,使用同一塊記憶體空間,bitmap,recycleview都有使用這種思想 在loop從訊息佇列中取出訊息並分發完後,並不會把訊息物件銷毀,而是通過msg.recycleunchecked 方法清空訊息放入訊息池進行 ...

Handler原始碼解析2

handler原始碼解析1 handler原始碼解析2 享元設計模式 記憶體復用,使用同一塊記憶體空間,bitmap,recycleview都有使用這種思想 在loop從訊息佇列中取出訊息並分發完後,並不會把訊息物件銷毀,而是通過msg.recycleunchecked 方法清空訊息放入訊息池進行 ...

Handler機制 Looper原始碼解析

安卓中handler框架處理訊息,其中looper類用來迴圈從messagequeue類中獲取訊息,然後呼叫handler進行消費.本文將基於安卓9.0 帶分析looper的實現.looper模擬較簡單,其主要類成員變數比較少.構造方法是私有的,一般會有靜態方法來常見例項.private loope...