在主線程中運行的部分,都可以直接使用Handler,因為在主線程啟動的過程中(ActivityThread的main函數里)會調用Looper.prepareMainLooper(),Looper類中也直接定義了一個static的looper實例sMainLooper用於存放主線程的Looper,可以通過靜態方法獲取到。 因此,凡是在主線程中運行的代碼段里 都可以直接new Handler()而不用去綁定Looper,MessageQueue;因為 因為 已經綁定過了呀^^^^^
Looper.prepare()方法是將當前線程綁定一個looper實例,並存儲在TreadLocal中,一個線程只有一個looper對象。
looper中,有一個messagequeue,即消息隊列;
handler可以通過sendmessage 等方法向隊列中發送消息。
一個線程中可以有多個handler,handler 綁定當前線程的looper對象,以及其中的消息隊列;
looper.loop()方法即循環調用MQ中的message,並且調用方送它的handler來處理它。
2、Looper實現原理
Looper類里包含一個消息隊列對象和一個線程對象。當創建Looper時,會自動創建一個消息隊列,同時將內部線程對象指向創建Looper的線程。當開啟Looper后(looper.loop()),會自動進入無限for循環中,不斷去遍歷消息隊列,如果沒有消息則阻塞,有消息則回調handler的handlemessage方法進行處理。
3、Looper.prepare()
首先,要使用Looper機制一般會在當前線程中創建Handler對象,里面會自動創建一個looper對象和消息隊列,這里面的消息隊列屬於當前線程空間。但此時的looper還不會去遍歷,也沒有綁定到當前線程。其中,looper對象內部也包含一個空消息隊列對象和空線程。通過Looper.prepare()方法,先讓該消息隊列指向當前線程的消息隊列,讓空線程也指向當前線程。從而實現了綁定。
from:http://www.nowcoder.com/questionTerminal/4f88dfd8ec97432f80308031e73507c1?orderByHotValue=0&query=android&pos=33