網站首頁 編程語言 正文
IdleHandler基本使用
IdleHandler原型
public static interface IdleHandler { boolean queueIdle(); }
不看源碼直接上結論,Android應用的運行都是靠著一條條Message入隊、出隊、執行實現,當應用主線程的消息隊列空閑的時候(消息隊列沒有消息或下一次消息執行的時間還未到),就會嘗試去執行IdleHandler
集合。
其中:IdleHandler
的queueIdle
方法的返回值如果為false,那么IdleHandler
執行完之后就會被移除,也就是說只會被執行一次;如果返回值為true,不會被移除且可以被執行多次。
所以我們就可以向消息隊列的IdleHandler
集合中插具體的IdleHandler
在應用主線程空閑的時候執行一些操作,基本的使用如下:
Looper.getMainLooper().queue.addIdleHandler { true }
案例1:執行GC
大家都知道,不能隨便在主線程執行GC,否則很容易造成卡頓,但是我們可以在主線程空閑的時候去執行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) { //執行GC BinderInternal.forceGc(reason); }
這樣既可以滿足gc回收對象的需要,又不會影響主線程中其他任務的執行
案例2:粗估Activity界面渲染時間
我們首先要明確界面渲染流程是發生在Activity的onResume
生命周期,往主線程消息隊列添加消息屏障(之后添加的Message只能執行異步類型的),然后發送界面渲染異步Message,等到界面渲染完成后才會從消息隊列移除屏障消息,這個時候才能正常執行其他Message。
參考下滴滴的DoKit開源庫:
我們現在onResume
方法中記錄界面開始渲染時間,添加一個IdleHandler
,這個會在界面渲染相關Message執行完畢后再執行它,所以就可以簡單的估算出界面渲染時長。
案例3:App大圖監測
常見的大圖監控方法都是將ImageView替換成自定義ImageView,然后重寫設置圖片的方法,比如setImageBitmap()
等等,在方法中計算下圖片的寬高是否超過ImageView的寬高,是就彈出一個彈窗提醒開發者,一般在Debug
環境下執行這種檢測。
Debug環境下開啟大圖檢測,一般為了避免影響主線程其他任務執行,都會添加一個IdleHandler
等主線程空閑了再去執行大圖檢測:
案例4:延遲啟動初始化任務
一般我們都在Application
的onCreate
方法中執行任務(比如第三方SDK)的初始化,可是如果執行的初始化任務過多就會增加啟動耗時,給用戶帶來較差體驗。
而且有的任務并不是一定就需要在Application
的onCreate
就必須要執行,可以延遲初始化,減少應用啟動耗時,這個時候就可以把相關延遲任務添加到一個Idlehandler
中去執行。
原文鏈接:https://juejin.cn/post/7089946584057659399
相關推薦
- 2022-04-25 .net5?使用Hangfire的過程記錄_實用技巧
- 2023-02-04 Go語言并發之原子操作詳解_Golang
- 2023-01-13 基于C#實現屏幕取色器_C#教程
- 2022-09-29 python繪制直方圖的方法_python
- 2023-01-13 碼云(gitee)通過git自動同步到阿里云服務器_服務器其它
- 2024-02-01 springboot @spring.active@啟動報錯
- 2022-10-23 Android事件分發機制示例分析_Android
- 2022-11-02 Kotlin中@JvmOverloads注解作用示例介紹_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支