Handler中幾個類型關(guān)系圖以及使用Handler常用問題

從上面的文章中我們已經(jīng)知道了Handler,MessageQuene,Message的源碼,Looper也看了loop方法,但是我們還漏調(diào)了Looper.prepare()方法,好那我們就來看這個源碼:



構(gòu)造方法是私有的所以我們不能直接new,那我們怎么創(chuàng)建一個Looper對象呢?

/**
 * Return the Looper object associated with the current thread.  Returns
 * null if the calling thread is not associated with a Looper.
 */
public static @Nullable Looper myLooper() {
    return sThreadLocal.get();
}

從threadLocal中獲取looper,并且有可能返回空,返回空的情況一般為在異步線程中沒有調(diào)用Looper.prepare()。ThreadLocal到底是個神馬東西,大概意思是這樣子的:
ThreadLocal的作用是提供線程內(nèi)的局部變量,這種變量在線程的生命周期內(nèi)起作用,減少同一個線程內(nèi)多個函數(shù)或者組件之間一些公共變量的傳遞的復(fù)雜度。以后章節(jié)會詳細(xì)介紹。在這里只需要記住用這個來保證一個線程只有一個Looper繼而保證只有一個消息隊列。
接下來我們再來看另外一個prepare()方法:

private static void prepare(boolean quitAllowed) {
    if (sThreadLocal.get() != null) {
        throw new RuntimeException("Only one Looper may be created per thread");
    }
    sThreadLocal.set(new Looper(quitAllowed));
}

可以看出如果當(dāng)前獲取的Looper為空會報錯。這樣也保證一個線程只有一個Looper繼而保證只有一個MessageQuene。好了源碼就講到這兒,我們最后通過一個完整的圖來整理源碼中的知識點(diǎn)


image.png
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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