基礎(chǔ)知識(shí)復(fù)習(xí)Handler

1.ThreadLocal

在ThreadLocal中我們主要關(guān)注的三個(gè)地方


image.png
  • ThreadLocalMap
    ThreadLocalMap 在哪里定義 ,在哪里引用?
    ThreadLocalMap的定義在ThreadLocal中但是他的引用是在Thread中
    ThreadLocalMap的Key是什么,適應(yīng)ThreadID行不行 為什么?
    ThreadLocalMap的Key是ThreadLocal對(duì)象 value為用戶的值
    不能使用ThreadId 因?yàn)槿绻褂肨hreadId作為key那面一個(gè)Thread的ThreadMap就只能保存一個(gè)對(duì)象了 不能在保存第二個(gè)對(duì)象,而使用ThreadLocal對(duì)象作為key 那么在一個(gè)Thread的ThreadMap中是可以保存多個(gè)ThreadLocal 對(duì)象的
  • ThreadLocal的作用
    ThreadLocal的作用是提供線程內(nèi)的局部變量,這種變量在線程的生命周期內(nèi)起作用。作用:提供一個(gè)線程內(nèi)公共變量(比如本次請(qǐng)求的用戶信息),減少同一個(gè)線程內(nèi)多個(gè)函數(shù)或者組件之間一些公共變量的傳遞的復(fù)雜度,或者為線程提供一個(gè)私有的變量副本,這樣每一個(gè)線程都可以隨意修改自己的變量副本,而不會(huì)對(duì)其他線程產(chǎn)生影響

2.handler的模型

image.png

3.Looper

  • Looper的創(chuàng)建時(shí)間


    image.png

    在App啟動(dòng)的時(shí)候在ActivityThread.Main()方法中調(diào)用 Looper.prepareMainLooer()創(chuàng)建

  • Looper.looper()

public static void loop() {
    final Looper me = myLooper();  //獲取TLS存儲(chǔ)的Looper對(duì)象 
    final MessageQueue queue = me.mQueue;  //獲取Looper對(duì)象中的消息隊(duì)列

    Binder.clearCallingIdentity();
    //確保在權(quán)限檢查時(shí)基于本地進(jìn)程,而不是調(diào)用進(jìn)程。
    final long ident = Binder.clearCallingIdentity();

    for (;;) { //進(jìn)入loop的主循環(huán)方法
        Message msg = queue.next(); //可能會(huì)阻塞 
        if (msg == null) { //沒(méi)有消息,則退出循環(huán)
            return;
        }

        //默認(rèn)為null,可通過(guò)setMessageLogging()方法來(lái)指定輸出,用于debug功能
        Printer logging = me.mLogging;  
        if (logging != null) {
            logging.println(">>>>> Dispatching to " + msg.target + " " +
                    msg.callback + ": " + msg.what);
        }
        msg.target.dispatchMessage(msg); //用于分發(fā)Message 
        if (logging != null) {
            logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
        }

        //恢復(fù)調(diào)用者信息
        final long newIdent = Binder.clearCallingIdentity();
        msg.recycleUnchecked();  //將Message放入消息池 
    }
}

loop()進(jìn)入循環(huán)模式,不斷重復(fù)下面的操作,直到?jīng)]有消息時(shí)退出循環(huán)
讀取MessageQuene的下一條messahe
把Meaasge分發(fā)給對(duì)應(yīng)target
把分發(fā)后Message回收到消息池,以便重復(fù)利用

4.Handler

消息發(fā)送調(diào)用鏈


image.png

5.MessageQueue

消息隊(duì)列 消息機(jī)制的核心 也是java層與native層之間的紐帶
他涉及到的native的方法有

private native static long nativeInit();
private native static void nativeDestroy(long ptr);
private native void nativePollOnce(long ptr, int timeoutMillis);
private native static void nativeWake(long ptr);
private native static boolean nativeIsPolling(long ptr);
private native static void nativeSetFileDescriptorEvents(long ptr, int fd, int events);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容