Handler,Looper, MessageQueue的工作原理解析

首先我們談下他們都是幹什麼的
Handler
消息的處理者。通過Handler對象我們可以封裝Message對象,然後通過sendMessage(msg)把Message對象添加到 MessageQueue中;當MessageQueue循環到該Message時,就會調用該Message對象對應的handler對象的 handleMessage()方法對其進行處理。由於是在handleMessage()方法中處理消息,因此我們應該編寫一個類繼承自 Handler,然後在handleMessage()處理我們需要的操作。
Looper
MessageQueue的管理者,在一個線程中,如果存在Looper對象,則必定存在MessageQueue對象,並且只存在一個Looper對象 和一個MessageQueue對象。倘若我們的線程中存在Looper對象,則我們可以通過Looper.myLooper()獲取,此外我們還可以通 過Looper.getMainLooper()獲取當前應用系統中主線程的Looper對象。在這個地方有一點需要注意,假如Looper對象位於應用 程序主線程中,則Looper.myLooper()和Looper.getMainLooper()獲取的是同一個對象。
MessageQueue
消息隊列,它採用先進先出的方式來管理Message,程序創建Looper對象時會在它的構造器中創建Looper對象,Looper提供的構造器源碼如下:

private Looper()
{
    mQueue= new MessageQueue();
    mRun=ture;
    mThread=Thread.currentThread();
}

private 表明程序員無法通過構造器創建Looper對象,但是在程序初始化時會創建出來一個MessageQueue 用來管理消息。
我們返回來說Handler Handler的作用是用來發送消息和處理消息,但是必須要發送到指定的MessageQueue,所以如果當前線程沒有MessageQueue,那麼他就會報錯的,經常我們在子線程裏面toast就會報錯,當在toast前面加Looper.prepare()時便正確了,這就是裏面的原因,當調用looper.prepare()時啓動Looper

for (;;) {
            Message msg = queue.next(); // might block
            if (msg == null) {
                // No message indicates that the message queue is quitting.
                return;
            }
          。。。。。(一系列操作)
    }

從上面可以看出,這是一個死循環,一直從消息隊列中取出消息,當消息隊列爲空時停止
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章