Android?IdleHandler基本使用及應(yīng)用案例詳解
IdleHandler基本使用
IdleHandler原型
public static interface IdleHandler {
boolean queueIdle();
}不看源碼直接上結(jié)論,Android應(yīng)用的運(yùn)行都是靠著一條條Message入隊(duì)、出隊(duì)、執(zhí)行實(shí)現(xiàn),當(dāng)應(yīng)用主線程的消息隊(duì)列空閑的時(shí)候(消息隊(duì)列沒有消息或下一次消息執(zhí)行的時(shí)間還未到),就會(huì)嘗試去執(zhí)行IdleHandler集合。
其中:IdleHandler的queueIdle方法的返回值如果為false,那么IdleHandler執(zhí)行完之后就會(huì)被移除,也就是說只會(huì)被執(zhí)行一次;如果返回值為true,不會(huì)被移除且可以被執(zhí)行多次。
所以我們就可以向消息隊(duì)列的IdleHandler集合中插具體的IdleHandler在應(yīng)用主線程空閑的時(shí)候執(zhí)行一些操作,基本的使用如下:
Looper.getMainLooper().queue.addIdleHandler {
true
}案例1:執(zhí)行GC
大家都知道,不能隨便在主線程執(zhí)行GC,否則很容易造成卡頓,但是我們可以在主線程空閑的時(shí)候去執(zhí)行GC,這個(gè)時(shí)候就可以利用IdleHandler,Android源碼中就有如下使用:
#ActivityThread
void scheduleGcIdler() {
Looper.myQueue().addIdleHandler(mGcIdler);
}
final class GcIdler implements MessageQueue.IdleHandler {
@Override
public final boolean queueIdle() {
doGcIfNeeded();
}
}
void doGcIfNeeded(String reason) {
//執(zhí)行GC
BinderInternal.forceGc(reason);
}這樣既可以滿足gc回收對(duì)象的需要,又不會(huì)影響主線程中其他任務(wù)的執(zhí)行
案例2:粗估Activity界面渲染時(shí)間
我們首先要明確界面渲染流程是發(fā)生在Activity的onResume生命周期,往主線程消息隊(duì)列添加消息屏障(之后添加的Message只能執(zhí)行異步類型的),然后發(fā)送界面渲染異步Message,等到界面渲染完成后才會(huì)從消息隊(duì)列移除屏障消息,這個(gè)時(shí)候才能正常執(zhí)行其他Message。
參考下滴滴的DoKit開源庫:

我們現(xiàn)在onResume方法中記錄界面開始渲染時(shí)間,添加一個(gè)IdleHandler,這個(gè)會(huì)在界面渲染相關(guān)Message執(zhí)行完畢后再執(zhí)行它,所以就可以簡(jiǎn)單的估算出界面渲染時(shí)長(zhǎng)。
案例3:App大圖監(jiān)測(cè)
常見的大圖監(jiān)控方法都是將ImageView替換成自定義ImageView,然后重寫設(shè)置圖片的方法,比如setImageBitmap()等等,在方法中計(jì)算下圖片的寬高是否超過ImageView的寬高,是就彈出一個(gè)彈窗提醒開發(fā)者,一般在Debug環(huán)境下執(zhí)行這種檢測(cè)。
Debug環(huán)境下開啟大圖檢測(cè),一般為了避免影響主線程其他任務(wù)執(zhí)行,都會(huì)添加一個(gè)IdleHandler等主線程空閑了再去執(zhí)行大圖檢測(cè):
案例4:延遲啟動(dòng)初始化任務(wù)
一般我們都在Application的onCreate方法中執(zhí)行任務(wù)(比如第三方SDK)的初始化,可是如果執(zhí)行的初始化任務(wù)過多就會(huì)增加啟動(dòng)耗時(shí),給用戶帶來較差體驗(yàn)。
而且有的任務(wù)并不是一定就需要在Application的onCreate就必須要執(zhí)行,可以延遲初始化,減少應(yīng)用啟動(dòng)耗時(shí),這個(gè)時(shí)候就可以把相關(guān)延遲任務(wù)添加到一個(gè)Idlehandler中去執(zhí)行。
到此這篇關(guān)于Android IdleHandler基本使用及應(yīng)用案例詳解的文章就介紹到這了,更多相關(guān)Android IdleHandler內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android獲取和讀取短信驗(yàn)證碼的實(shí)現(xiàn)方法
這篇文章主要介紹了Android獲取和讀取短信驗(yàn)證碼的實(shí)現(xiàn)方法,文章內(nèi)容介紹了如何讀取剛收到的短信的相關(guān)內(nèi)容,以及Android獲取短信驗(yàn)證碼的方法,感興趣的小伙伴們可以參考一下2016-03-03
Android自定義Animation實(shí)現(xiàn)View搖擺效果
這篇文章主要為大家詳細(xì)介紹了Android自定義Animation實(shí)現(xiàn)View搖擺效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Android在一個(gè)app中安裝并卸載另一個(gè)app的示例代碼
這篇文章主要介紹了Android在一個(gè)app中安裝并卸載另一個(gè)app的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Android?imageVIew實(shí)現(xiàn)鏡像旋轉(zhuǎn)的方法
在Android應(yīng)用開發(fā)中,有時(shí)候我們需要對(duì)ImageView中的圖片進(jìn)行鏡像旋轉(zhuǎn),以展示不同的效果,本文將介紹如何使用代碼實(shí)現(xiàn)ImageView的鏡像旋轉(zhuǎn)效果,這篇文章主要介紹了Android?imageVIew如何做鏡像旋轉(zhuǎn),需要的朋友可以參考下2024-06-06
Android垃圾回收機(jī)制解決內(nèi)存泄露問題
這篇文章主要介紹了Android垃圾回收機(jī)制解決內(nèi)存泄露問題的相關(guān)資料,需要的朋友可以參考下2016-02-02
Android手勢(shì)密碼view學(xué)習(xí)筆記(一)
這篇文章主要為大家詳細(xì)介紹了Android手勢(shì)密碼view的學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android軟件自動(dòng)更新實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android軟件自動(dòng)更新實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10

