1.一個線程有幾個 Handler?
答:一個線程可以用有多 Handler,因為 Handler 最終是被 Message 持用的(post 里面的 Runnable 最終也會被包裝成一個 Message),以便 Looper 在拿到 Message 后調(diào)用 Handler 的 dispatchMessage 完成回調(diào),而且項目中仔細(xì)去看也確實如此,我們可以每個 Activity 中都創(chuàng)建一個 Handler 來處理回調(diào)到主線程的任務(wù)。
2.一個線程有幾個 Looper?如何保證?
答:一個線程只能擁有一個 Looper,這里從源碼中就可以看到,sThreadLocal.set 只調(diào)用了一次,如果再次調(diào)用 prepare 會判斷 sThreadLocal.get 是否為空,如果不為空就直接拋出異常了,所以這里也避免了程序去修改某個線程已經(jīng)設(shè)置好的 Looper 值。

3.為何主線程可以使用 Handler?如果想要在子線程中使用 Handler 機(jī)制要做些什么準(zhǔn)備?
答:先來看下面的源碼,Handler 的構(gòu)造中(無論調(diào)用哪個最終都會走到這里),是需要判斷當(dāng)前線程是否存在 Looper 的,如果不存在會直接拋出異常,主線程之所以可以使用 Handler 是因為系統(tǒng)幫在 ActivityThread 中已經(jīng)幫我們創(chuàng)建了 Looper 并且已經(jīng)讓它運行了起來。

系統(tǒng)幫我們在主線程創(chuàng)建 Looper 的代碼:

如果我們現(xiàn)在子線程中使用 Handler 的話,就需要模仿一下系統(tǒng)怎么創(chuàng)建 Looper,其實就是兩步,在子線程中調(diào)用 Looper.prepare() 和 Looper.loop() 即可,prepare 幫我們在對應(yīng)線程創(chuàng)建 Looper,loop 讓剛剛創(chuàng)建好的 Looper 運行起來。
這兩步完成后我們就可以在子線程中使用 Handler 了。
以上所說的 Handler 使用指的是 Handler 的創(chuàng)建,比如在 A 線程創(chuàng)建后就可以在任何位置使用了,也就是在任意線程發(fā)送消息,然后在 A 線程處理消息。