Handler的異步消息處理運行機制,線程間通信

一、引言

Android開發中總是免不了處理一些耗時的操作,如網絡請求、IO文件讀寫等等,都需要用子線程來處理,耗時操作往往也伴隨著更新UI的顯示。此時就涉及到UI線程與子線程之間的通信問題。為此Android系統引入了Handler異步消息處理的機制。

二、在子線程中更新UI

Android中想要在子線程中更新UI,通常有三種辦法:

  1. Handler的post方法
  2. View視圖控件的post方法
  3. Activity的runOnUiThread()方法

Handler的post方法,應該都很清楚,內部的Runnable的run方法已經是在UI線程執行了。View的post方法、Activity的runOnUiThread()方法怎么也可以在UI線程呢,來看看其內部實現:

// View.java
public boolean post(Runnable action) {
    final AttachInfo attachInfo = mAttachInfo;
    if (attachInfo != null) {
        return attachInfo.mHandler.post(action);
    }

    // Postpone the runnable until we know on which thread it needs to run.
    // Assume that the runnable will be successfully placed after attach.
    getRunQueue().post(action);
    return true;
}

// Activity.java
public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }

很顯然從源碼可以看出最終都是交給主線程Handler的post方法來處理。那么為什么主線程聲明實例化的Handler的post方法在子線程調用就可以用來更新UI呢?這個問題暫時先放這里。接下來進一步分析Handler。

三、Handler的消息處理機制

在Handler的消息處理架構中,和Message、MessageQueue、Looper這三個類是緊密相連的。
Message:消息數據承載類,可以是事件任務消息,也可以是其它的實體數據消息。
MessageQueue:消息隊列。用于將消息入隊和出隊,以及消息從隊列刪除釋放的管理。
Looper:消息循環處理器。用于維持一個死循環不斷的從MessageQueue中取出消息,并將消息分發給設置的目標對象處理(target即Handler)。
Handler:它是整個機制的輔助類。也是提供給客戶端使用對外暴露Api。用于輔助把消息加入隊列、刪除釋放消息事件和消息的回調處理。

Handler中我們最常用的有post()、postDelay()、sendMessage()等方法,直接或者間接的在內部構建一個Message消息對象然后通過MQ(MessageQueue)的enqueueMessage來處理消息入隊的工作。App啟動的時候在ActivityThread類的main方法里就先通過prepareMainLooper方法預加載了一個Looper對象,然后通過loop方法開啟了消息循環器。

// ActivityThread.java
public static void main(String[] args) {
    ...
    Looper.prepareMainLooper();
    ActivityThread thread = new ActivityThread();
    thread.attach(false);
    ...
    Looper.loop();
    ...
}

以上的Looper對象是主線程的,因此構造的MQ消息隊列也是主線程的,loop()方法中不斷循環取出隊列中的消息,通過handler的dispatchMessage方法分發消息。當然從一個事件消息的發送入隊到出隊處理回調不一定是實時的,MQ的enqueueMessage和next方法可以看出它是一個單向鏈表隊列,入隊的時候根據消息發送的時間when按升序排序,當when為0時插入到隊列頭部。

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

推薦閱讀更多精彩內容