日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android?IdleHandler使用方法詳解_Android

作者:xuyisheng ? 更新時間: 2022-12-07 編程語言

正文

在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

欄目分類
最近更新