參考文章:
答案在於:threadlocal。
看**一下子就可以知道了:
一開始就構造了乙個looper
,我們看looper.mylooper()
做了什麼。
可以 看到就是呼叫了一下sthreadlocal.get()
。看一下sthreadlocal
的定義:
這裡說,如果不呼叫prepare()
方法就會返回空,我們去看一下prepare
方法:
就是呼叫了threadlocal
的set
方法:
建立乙個threadlocalmap
,賦值給t中的threadlocals
物件。threadlocalmap
是什麼?
當new threalocalmap的時候,做了什麼事情?
看到這裡其實也可以明白一點了,threadlocal採用了陣列 + entry的方式來模擬map,key採用的是threadlocal的唯一標識,value就是你傳遞進來的資料(這裡指looper),然後把這個threadlocal物件給到thread(執行緒)
中的乙個成員變數。當要取的時候,取出這個成員變數,獲取threadlocal的唯一標識,就可以獲取到我們之前儲存的資料(也就是looper)。
我們可以通過get
方法驗證一下,應該就是通過threadlocal
的唯一標識,獲得對應的entry
,然後從裡面取出對應的looper
。
答:因為android的ui執行緒是不安全的,如果多執行緒併發訪問,會導致ui控制處於不可預期的狀態。
答:缺點有兩個:
Android訊息機制
looper執行緒 主人 的 message queue 郵箱 唯一的管理人員 handler快遞小哥 跟管理人員looper溝通,送 push 新郵件 訊息 讓管理人員looper代簽扔進郵箱 message queue,也接收管理人員從郵箱拿出來的件。message queue 訊息佇列 主人的...
android 訊息機制
color green 一 角色描述 1.looper 乙個執行緒可以產生乙個looper物件,由它來管理此執行緒裡的message queue 訊息佇列 2.handler 你可以構造handler物件來與looper溝通,以便push新訊息到message queue裡 或者接收looper 從...
Android訊息機制 一
一 角色描述 1.looper 乙個執行緒可以產生乙個looper物件,由它來管理此執行緒裡的message queue 訊息佇列 2.handler 你可以構造handler物件來與looper溝通,以便push新訊息到message queue裡 或者接收looper 從message queu...