Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 淺析Android Handle機制

淺析Android Handle機制

編輯:關於Android編程

一.Handle的用例:

1.創建handle實例

new handle();

2.發送信息載體(Message)

sendMessage(msg);

3.處理消息

handleMessage(Message msg){};


二.原理淺析

結合以上的handle調用三部曲,我們將順籐摸瓜理清Handle、Looper、Message、MessageQueue的邏輯與關系。

1.new Handle():這個操作將生成一個Handle實例,handle實例有三個屬性mLooper、mQueue、mCallback,以下解釋這三個屬性的來歷。

1.a:
mLooper = Looper.myLooper();Looper的myLooper靜態方法也很簡單、
public static Looper myLooper() {
 return sThreadLocal.get();
}

sThreadLocal是一個單例對象,他的類型是ThreadLocal,這個類有set()、get()方法,他的作用是當前線程的對象,那麼這句代碼的作用很明顯了就是返回當前線程的Looper對象。再深入一點想,他的set方法在哪裡呢?答案是在prepare中:

private static void prepare(boolean quitAllowed) {
 if (sThreadLocal.get() != null) {
    throw new RuntimeException("Only one Looper may be created per thread");
 }
 sThreadLocal.set(new Looper(quitAllowed));
}

從該方法中可見每個線程中只可以調用一次prepare方法,即每個線程中只有一個Looper對象。

1.b:

mQueue = mLooper.mQueue;
Looer對象的mQueue是一個非靜態的變量,即:

final MessageQueue mQueue;

他亦在Looper創建時候生成,MessageQueue我們暫時簡單理解為消息隊列,但是切記他並非等同於:Queue

1.c:mCallback是一個回調接口,他只有一個方法handleMessage:

public interface Callback {
	public boolean handleMessage(Message msg);
}


2. sendMessage(msg):

這個操作正是他們之間聯系的樞紐我們一一來看,首先msg的生成,再看發送msg的動作。

2.a:msg的生成;在Message類中我們看到有個Handle類型的target,所有發送到Handle的msg都會把這個target設置為當前的Handle,如sendMessage()方法最終會有這樣一個操作:

msg.target = this;

2.b:sendMessage();無論那個重載方法最終都調用queue.enqueueMessage(msg, uptimeMillis);這個方法中會根據when這個參數來進行排隊。即在1.b中的消息隊列中排序。


3.handleMessage:處理Message的操作在Looper類中的loop方法中,回顧到1.a我們知道Looper是當前線程的一個單例,即當前線程的所有Message都會再次被處理。Loop方法中有一個死循環將遍歷mQueue中的Message並執行dispatchMessage(msg)方法:

msg.target.dispatchMessage(msg);

可見msg的target將處理自己。

方法再次回到Handle類的dispatchMessage方法

    public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
}

如果mCallback不為空就執行mCallback的handleMessage方法,否則執行自身的handleMessage方法。


4.總結:Android通過如此巧妙的結構實現了線程間的通信,如果要弄的徹底明白,以Activity為例,在Activity中找到mainThread即我們通常說的主線程,可以清楚的看到looper的創建以及如何進行消息管理。





  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved