Handler原始碼解析2

2021-10-11 15:07:55 字數 1030 閱讀 2391

handler原始碼解析1

handler原始碼解析2

享元設計模式

記憶體復用,使用同一塊記憶體空間,bitmap,recycleview都有使用這種思想

在loop從訊息佇列中取出訊息並分發完後,並不會把訊息物件銷毀,而是通過msg.recycleunchecked()方法清空訊息放入訊息池進行**

這樣做可以避免反覆建立和銷毀msg物件,造成記憶體抖動和oom

建立訊息的時候使用obtain方法從記憶體中取,不用反覆申請記憶體空間

同步屏障

可以遮蔽同步訊息,來優先執行系統中重要的非同步訊息

命中if後,進入迴圈過濾掉同步訊息,而msg.target=null 的時候該訊息就是乙個同步屏障

例如螢幕重新整理,anr通知等重要訊息就可以優先通過這種方式執行

handlerthread

handlerthread是thread的子類,嚴格意義上來說就是乙個執行緒,只是它在自己的執行緒裡面幫我們建立了looper

handlerthread 存在的意義如下:

1) 方便使用:a. 方便初始化,b,方便獲取執行緒looper

2)保證了執行緒安全

我們在子執行緒中使用looper需要通過 looper.prepare() looper.loop()兩個步驟,而且還不能保證執行緒安全

看看handlerthread中的處理

在run方法裡面為我們封裝好了這兩個方法

兩個方法加了隱式鎖

1.可以有無數個

2.乙個,通過threadlocal來保證

3.內部類持有外部類的物件,而生命週期不一致。具體是msg.target持有了handler物件,而handler物件持有了外部類的activity物件,當activity銷毀時,msg沒有銷毀導致的記憶體洩漏

4.mlooper.prepare 和 mlooper.loop

5.呼叫quit,結束loop迴圈

6.synchronized鎖

obtain

8.anr是事件5s為響應,而looper休眠時因為沒得事件執行,兩者並沒有關聯

Handler原始碼解析2

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

Handler原始碼解析

意思就是說 在沒有呼叫looper.prepare 之前不能在子執行緒建立handler。為什麼在主線程中我們就已經可以直接建立handler?因為在activity的啟動 中,已經在當前ui執行緒 主線程 呼叫了looper.preparemainlooper 和looper.loop 方法。我們...

Handler機制 Looper原始碼解析

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