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

學無先后,達者為師

網站首頁 編程語言 正文

Android?IdleHandler基本使用及應用案例詳解_Android

作者:長安皈故里 ? 更新時間: 2022-11-23 編程語言

IdleHandler基本使用

IdleHandler原型

public static interface IdleHandler {
    boolean queueIdle();
}

不看源碼直接上結論,Android應用的運行都是靠著一條條Message入隊、出隊、執行實現,當應用主線程的消息隊列空閑的時候(消息隊列沒有消息或下一次消息執行的時間還未到),就會嘗試去執行IdleHandler集合。

其中:IdleHandlerqueueIdle方法的返回值如果為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:延遲啟動初始化任務

一般我們都在ApplicationonCreate方法中執行任務(比如第三方SDK)的初始化,可是如果執行的初始化任務過多就會增加啟動耗時,給用戶帶來較差體驗。

而且有的任務并不是一定就需要在ApplicationonCreate就必須要執行,可以延遲初始化,減少應用啟動耗時,這個時候就可以把相關延遲任務添加到一個Idlehandler中去執行。

原文鏈接:https://juejin.cn/post/7089946584057659399

欄目分類
最近更新