亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android開發(fā)使用Message對(duì)象分發(fā)必備知識(shí)點(diǎn)詳解

 更新時(shí)間:2022年10月13日 09:47:00   作者:長(zhǎng)安皈故里  
這篇文章主要為大家介紹了Android開發(fā)使用Message對(duì)象分發(fā)必備知識(shí)點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Message的創(chuàng)建

消息Message一般不支持大家直接通過new的方式進(jìn)行創(chuàng)建的,因?yàn)?code>Message作為Android系統(tǒng)中使用頻率非常高的一個(gè)對(duì)象,如果每次都泛濫的直接創(chuàng)建一個(gè)新的,對(duì)性能是有一定影響的,而通過對(duì)象池的方式進(jìn)行復(fù)用 ,則是非常好的一種方式。

Message中就提供了這樣的一個(gè)對(duì)象池(最大緩存消息數(shù)量為50):

通過鏈表的形式將一個(gè)個(gè)待復(fù)用的緩存Message連接起來。并且提供了obtain()方法負(fù)責(zé)從對(duì)象池中獲取一個(gè)Message

public static Message obtain() {
    synchronized (sPoolSync) {
        if (sPool != null) {
            Message m = sPool;
            sPool = m.next;
            m.next = null;
            m.flags = 0; // clear in-use flag
            sPoolSize--;
            return m;
        }
    }
    return new Message();
}

當(dāng)消息調(diào)度完畢時(shí),會(huì)通過recycleUnchecked()方法進(jìn)行回收并放入到對(duì)象池:

void recycleUnchecked() {
    flags = FLAG_IN_USE;
    what = 0;
    arg1 = 0;
    arg2 = 0;
    obj = null;
    ...
    synchronized (sPoolSync) {
        if (sPoolSize < MAX_POOL_SIZE) {
            next = sPool;
            sPool = this;
            sPoolSize++;
        }
    }
}

重置要回收的Message的各個(gè)成員屬性,然后添加到對(duì)象池sPool

消息分發(fā)執(zhí)行的三種方式

消息調(diào)度分發(fā)最終是在Looper.loopOnce()中執(zhí)行,我們看下源碼:

private static boolean loopOnce(final Looper me,
        final long ident, final int thresholdOverride) {
    Message msg = me.mQueue.next(); // might block
    if (msg == null) {
        return false;
    }
    try {
        msg.target.dispatchMessage(msg);
    }
    msg.recycleUnchecked();
    return true;
}

核心就是msg.target.dispatchMessage(),我們看下具體的方法邏輯:

public void dispatchMessage(@NonNull Message msg) {
    if (msg.callback != null) {
        handleCallback(msg);
    } else {
        if (mCallback != null) {
            if (mCallback.handleMessage(msg)) {
                return;
            }
        }
        handleMessage(msg);
    }
}

源碼一目了然,接下來我們一個(gè)個(gè)的進(jìn)行分析:

  • 先檢測(cè)Messagecallback是否為null,不為null就執(zhí)行callbackrun方法調(diào)度執(zhí)行,這個(gè)一般是如何傳入的呢:
public final boolean post(@NonNull Runnable r) {
   return  sendMessageDelayed(getPostMessage(r), 0);
}
private static Message getPostMessage(Runnable r) {
    Message m = Message.obtain();
    m.callback = r;
    return m;
}

很熟悉的post()方法就并不再過多介紹了。

  • 然后檢測(cè)HandermCallback是否為null,不為null就執(zhí)行mCallback.handleMessage(),這個(gè)是什么時(shí)候傳入的呢:
public Handler(@NonNull Looper looper, @Nullable Callback callback, boolean async) {
    mLooper = looper;
    mQueue = looper.mQueue;
    mCallback = callback;
    mAsynchronous = async;
}

通過Handler構(gòu)造方法時(shí)作為構(gòu)造參數(shù)傳入,可以選擇性使用。

  • 上面都不滿足,就調(diào)用Handler自身的handleMessage()方法調(diào)度執(zhí)行,這也是我們常用的消息執(zhí)行的一種方式,一般都是創(chuàng)建Handler對(duì)象時(shí)重寫這個(gè)該方法:
fun test333() {
    val handler = object : Handler(Looper.getMainLooper()) {
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
        }
    }
}

以上三種消息分發(fā)方式第一種和第三種使用的頻率比較高,第二種這種方式可以作為一種hook的手段攔截某些消息的原本調(diào)度邏輯,實(shí)現(xiàn)功能增強(qiáng)。

比如Activity、Service等組件的調(diào)度是通過ApplicationThread通過Handler分發(fā)到主線程進(jìn)行調(diào)度執(zhí)行,如果你想監(jiān)聽其生命周期,就可以通過上面的第二種方式結(jié)合反射給負(fù)責(zé)分發(fā)的Handler注入一個(gè)mCallback屬性值。

總結(jié)

本篇文章主要是介紹了Message創(chuàng)建的正確方式,以及其如何在Handler中調(diào)度分發(fā)的,每個(gè)流程是什么,希望能給你帶來幫助。

更多關(guān)于Android開發(fā)Message對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論