網站首頁 編程語言 正文
正文
在Android中,Handler是一個使用的非常頻繁的東西,輸入事件機制和系統狀態,都通過Handler來進行流轉,而在Handler中,有一個很少被人提起但是卻很有用的東西,那就是IdleHandler,它的源碼如下。
/**
* Callback interface for discovering when a thread is going to block
* waiting for more messages.
*/
public static interface IdleHandler {
/**
* Called when the message queue has run out of messages and will now
* wait for more. Return true to keep your idle handler active, false
* to have it removed. This may be called if there are still messages
* pending in the queue, but they are all scheduled to be dispatched
* after the current time.
*/
boolean queueIdle();
}
從注釋我們就能發現,這是一個IdleHandler的靜態接口,可以在消息隊列沒有消息時或是隊列中的消息還沒有到執行時間時才會執行的一個回調。
這個功能在某些重要但不緊急的場景下就非常有用了,比如我們要在主頁上做一些處理,但是又不想影響原有的初始化邏輯,避免卡頓,那么我們就需要等系統閑下來的時候再來執行我們的操作,這個時候,我們就可以通過IdleHandler來進行回調。
它的使用也非常簡單,代碼示例如下。
Looper.myQueue().addIdleHandler {
// Do something
false
}
在Handler的消息循環中,一旦隊列里面沒有需要處理的消息,該接口就會回調,也就是Handler空閑的時候。
這個接口有返回值,代表是否需要持續執行,如果返回true,那么一旦Handler空閑,就會執行IdleHandler中的回調,而如果返回false,那么就只會執行一次。
當返回true時,可以通過removeIdleHandler的方式來移除循環的處理,如果是false,那么在處理完后,它自己會移除。
綜上,IdleHandler的使用主要有下面這些場景。
- 低優先級的任務處理:替換之前為了不在初始化的時候影響性能而使用的Handler.postDelayed方法,通過IdleHandler來自動獲取空閑的時機。
- Idle時循環處理任務:通過控制返回值,在系統空閑時,不斷重復某個操作。
但是要注意的是,如果Handler過于繁忙,那么IdleHandler的執行時機是有可能被延遲很久的,所以,要注意一些比較重要的處理邏輯的處理時機。
在很多第三方庫里面,都有IdleHandler的使用,例如LeakCanary,它對內存的dump分析過程,就是在IdleHandler中處理的,從而避免對主線程的影響。
原文鏈接:https://juejin.cn/post/7163086937383763975
相關推薦
- 2022-06-01 Android實現簡單的照相功能_Android
- 2023-08-15 :prop父組件給子組件傳遞函數 子組件接收 并default子組件自己的方法 問題
- 2022-09-08 redis?lua限流算法實現示例_Redis
- 2022-03-31 解決Android加殼過程中mprotect調用失敗的原因分析_Android
- 2023-03-16 numpy如何獲取array中數組元素的索引位置_python
- 2022-11-05 Kotlin方法與Lambda表達式實踐使用介紹_Android
- 2022-08-04 GoFrame框架gset交差并補集使用實例_Golang
- 2022-11-28 Git基礎學習之tag標簽操作詳解_相關技巧
- 最近更新
-
- 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同步修改后的遠程分支