Android?IdleHandler基本使用及應(yīng)用案例詳解
IdleHandler基本使用
IdleHandler原型
public static interface IdleHandler { boolean queueIdle(); }
不看源碼直接上結(jié)論,Android應(yīng)用的運行都是靠著一條條Message入隊、出隊、執(zhí)行實現(xiàn),當(dāng)應(yīng)用主線程的消息隊列空閑的時候(消息隊列沒有消息或下一次消息執(zhí)行的時間還未到),就會嘗試去執(zhí)行IdleHandler
集合。
其中:IdleHandler
的queueIdle
方法的返回值如果為false,那么IdleHandler
執(zhí)行完之后就會被移除,也就是說只會被執(zhí)行一次;如果返回值為true,不會被移除且可以被執(zhí)行多次。
所以我們就可以向消息隊列的IdleHandler
集合中插具體的IdleHandler
在應(yīng)用主線程空閑的時候執(zhí)行一些操作,基本的使用如下:
Looper.getMainLooper().queue.addIdleHandler { true }
案例1:執(zhí)行GC
大家都知道,不能隨便在主線程執(zhí)行GC,否則很容易造成卡頓,但是我們可以在主線程空閑的時候去執(zhí)行GC,這個時候就可以利用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回收對象的需要,又不會影響主線程中其他任務(wù)的執(zhí)行
案例2:粗估Activity界面渲染時間
我們首先要明確界面渲染流程是發(fā)生在Activity的onResume
生命周期,往主線程消息隊列添加消息屏障(之后添加的Message只能執(zhí)行異步類型的),然后發(fā)送界面渲染異步Message,等到界面渲染完成后才會從消息隊列移除屏障消息,這個時候才能正常執(zhí)行其他Message。
參考下滴滴的DoKit開源庫:
我們現(xiàn)在onResume
方法中記錄界面開始渲染時間,添加一個IdleHandler
,這個會在界面渲染相關(guān)Message執(zhí)行完畢后再執(zhí)行它,所以就可以簡單的估算出界面渲染時長。
案例3:App大圖監(jiān)測
常見的大圖監(jiān)控方法都是將ImageView替換成自定義ImageView,然后重寫設(shè)置圖片的方法,比如setImageBitmap()
等等,在方法中計算下圖片的寬高是否超過ImageView的寬高,是就彈出一個彈窗提醒開發(fā)者,一般在Debug
環(huán)境下執(zhí)行這種檢測。
Debug環(huán)境下開啟大圖檢測,一般為了避免影響主線程其他任務(wù)執(zhí)行,都會添加一個IdleHandler
等主線程空閑了再去執(zhí)行大圖檢測:
案例4:延遲啟動初始化任務(wù)
一般我們都在Application
的onCreate
方法中執(zhí)行任務(wù)(比如第三方SDK)的初始化,可是如果執(zhí)行的初始化任務(wù)過多就會增加啟動耗時,給用戶帶來較差體驗。
而且有的任務(wù)并不是一定就需要在Application
的onCreate
就必須要執(zhí)行,可以延遲初始化,減少應(yīng)用啟動耗時,這個時候就可以把相關(guān)延遲任務(wù)添加到一個Idlehandler
中去執(zhí)行。
到此這篇關(guān)于Android IdleHandler基本使用及應(yīng)用案例詳解的文章就介紹到這了,更多相關(guān)Android IdleHandler內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android ListView優(yōu)化之提高android應(yīng)用效率
android listview優(yōu)化做的好是提高androoid應(yīng)用效率的前提條件,本文給大家介紹Android ListView優(yōu)化之提高android應(yīng)用效率,對android listview優(yōu)化相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2015-12-12Android 獲取屏幕高度,標(biāo)題高度,狀態(tài)欄高度(實例代碼)
getWindow().findViewById(Window.ID_ANDROID_CONTENT)這個方法獲取到的view就是程序不包括標(biāo)題欄的部分,然后就可以知道標(biāo)題欄的高度了2013-11-11Android拼圖游戲 玩轉(zhuǎn)從基礎(chǔ)到應(yīng)用手勢變化
這篇文章主要介紹了Android拼圖游戲的實現(xiàn)方法,教大家玩轉(zhuǎn)從基礎(chǔ)到應(yīng)用手勢變化,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10Android填坑系列:在小米系列等機(jī)型上放開定位權(quán)限后的定位請求彈框示例
本文詳細(xì)介紹了在小米系列等機(jī)型上放開定位權(quán)限后的定位請求彈框示例,例如在應(yīng)用軟件中提示顯示定位服務(wù),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-11-11在android開發(fā)中進(jìn)行數(shù)據(jù)存儲與訪問的多種方式介紹
很多時候我們的軟件需要對處理后的數(shù)據(jù)進(jìn)行存儲或再次訪問,Android為數(shù)據(jù)存儲提供了多種方式,首先給大家介紹使用文件如何對數(shù)據(jù)進(jìn)行存儲,感興趣的朋友可以了解下哈2013-06-06內(nèi)存泄露導(dǎo)致Android?中setVisibility()?失效原理
這篇文章主要介紹了內(nèi)存泄露導(dǎo)致Android?中setVisibility()?失效原理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-07-07