源碼學習|Android Handler 消息機制源碼分析(二)

在上次我們分析到Handler在創建時會綁定一個Looper對象,而如果Looper用戶不進行顯式傳入,會在Handler中調用Looper.myLooper()來創建一個Looper對象。?

那什么是Looper呢?Android中對于Looper類的注釋中是這樣描述的:“Class used to run a message loop for a thread”。大概意思是指這個類是用來為一個線程做消息循環。而Looper 類本身被聲明為final類型的,同時它的構造方法也被聲明為final類型。所以我們如果要獲取其中的Looper實例或者使用Looper的方法需要使用其中提供的兩種靜態方法:

我們可以看到,無論是getMainLooper()方法還是myLooper()方法,獲取的Looper都是直接返回已經初始化的對象。那它們的初始化在哪操作的呢?如下圖所示:

我們可以看到,主線程Looper和子線程Looper創建的區別在于一個quitAllowed變量(主線程為false, 子線程為true)。而最終這個變量會傳入到Looper構造方法中用于構造MessageQueue。而Looper中的線程綁定的是當前線程。如下圖所示:


這樣的話,結合上一篇,我們可以發現,直接在子線程中使用Handler handler = new Handler(),會調用Looper.myLooper()方法獲取Looper對象,在這之前并沒有調用Looper.prepare()方法進行初始化,所以sThreadLocal.get()中會返回null,進而報錯。

那大家或許會問,主線程中的mainLooper是何時進行初始化的呢,為什么主線程中直接new Handler()不會報錯呢?其實這個主線程Handler在應用啟動時就已經進行了初始化,具體啟動時機需要在后面繼續分析呢~??

ps:更新相關的兩篇文章傳送門:

《Android Handler消息機制源碼分析(一)》?

《Android Handler消息機制源碼分析(三)》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容