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

學無先后,達者為師

網站首頁 編程語言 正文

詳解Android創建Handler的必備知識點_Android

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

普通Handler創建

一般下面這樣創建Handler時AS會進行告警:

刪除線提示Handler的無參構造方法已經被@Deprecated標記,正確的做法都是使用帶Looper構造參數的構造方法進行Handler的創建:

這樣做的好處是直接指定消息調度在哪個Looper,而Looper是通過ThreadLocal和線程綁定在一起,也就是說,指明了Looper就能知道當前消息Message最終會在哪個線程中執行。

而之所以Handler無參構造方法被廢棄的一個原因就是:

它會嘗試從當前線程中的ThreadLocal獲取Looper,主線程會自動幫助我們創建好Looper自然是沒什么問題,但是如果子線程中執行Handler的創建,而沒有手動調用Looper.prepare(),就會導致崩潰。

異步Handler的使用及創建

異步Handler有什么作用呢,相比較于普通Handler,可以獲取優先調度執行權,當前,前提是要添加同步屏障消息。

這里解釋下同步屏障消息:

同步屏障消息和普通的Message基本上沒啥區別,主要的一個區分點是同步屏障消息Messagetarget屬性為null,當從消息隊列中取出消息并執行時,會先判斷下當前的Messagetarget是否為null,如果為null則會從消息隊列中優先獲取異步消息 進行調度執行。

相應的源碼如下:

添加消息屏障的方法為MessageQueue.postSyncBarrier(),不過這個方法目前是不支持業務方直接進行調用。

上面消息屏障說完了,我們接下來看下異步消息如何創建:異步消息的創建依賴異步Hanlder的創建。所以我們看下異步Handler如何進行創建:

@NonNull
public static Handler createAsync(@NonNull Looper looper) {
    if (looper == null) throw new NullPointerException("looper must not be null");
    return new Handler(looper, null, true);
}

@NonNull
public static Handler createAsync(@NonNull Looper looper, @NonNull Callback callback) {
    if (looper == null) throw new NullPointerException("looper must not be null");
    if (callback == null) throw new NullPointerException("callback must not be null");
    return new Handler(looper, callback, true);
}

Handler提供了createAsync()兩個重載方法進行創建,最終會將HandlermAsynchronous屬性置為true,然后通過Hanlder發送消息時,最終會走到Handler.enqueueMessage()方法:

private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg,
        long uptimeMillis) {
    ...
    if (mAsynchronous) {
        msg.setAsynchronous(true);
    }
    return queue.enqueueMessage(msg, uptimeMillis);
}

可以看到,如果mAsynchronous屬性為true,就將Message添加FLAG_ASYNCHRONOUS置為異步消息。不過這個API是只有在SDK>=28以上才能調用,那么消息28的版本如何創建的,這里給出一個非常全面的兼容各個SDK版本的創建異步Handler的方法:

上面的使用講完了,說下應用了。這個異步消息+消息屏障在系統源碼中有一個非常典型的應用場景,那就是界面的繪制:

由于界面的繪制渲染優先級是比較高的,所以添加消息屏障后,將繪制相關的Message指定為異步方式,就可以優先進行執行。

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

欄目分類
最近更新