Handler深入解析(二)

上一節講了Handler的構造和消息發送,這一節繼續Handler的消息移除和消息處理。

 

一、消息移除

消息移除就是講MessageMessageQueue中移除。先上代碼:

public final voidremoveMessages(intwhat) {
    mQueue.removeMessages(this, what,null);
}

public final voidremoveMessages(intwhat, Object object) {
    mQueue.removeMessages(this, what, object);
}

public final voidremoveCallbacks(Runnable r)
{
    mQueue.removeMessages(this, r,null);
}

public final voidremoveCallbacks(Runnable r, Object token)
{
    mQueue.removeMessages(this, r, token);
}

public final voidremoveCallbacksAndMessages(Object token) {
    mQueue.removeCallbacksAndMessages(this, token);
}

主要是通過與Handler關聯的LooperMessageQueue來移除消息,因爲是通過Handler來發送消息,且和Handler綁定,所以在Handler中移除,但處理上沒Handler啥事。就不多說,後期講解到LooperMessageQueue時會做出說明!和消息移除和消息發送相關還有消息判斷,主要可用的有兩種:

public final booleanhasMessages(intwhat) {
    return mQueue.hasMessages(this, what,null);
}

public final booleanhasMessages(intwhat, Object object) {//低版本好像沒有
    return mQueue.hasMessages(this, what, object);
}

最終也都是通過消息隊列(MessageQueue)來處理!

Handler還提供了獲取關聯Looper的方法:

public finalLooper getLooper() {
    return mLooper;
}

因爲MessageQueue是和Looper綁定的,所以獲取MessageQueue是通過Looper來獲取,Handler也就沒有提供對應的方法,從MessageQueue的初始化也可以看出!

二、消息處理

終於說到消息處理,我們用到的消息處理無外乎兩種,實現Callback接口,在接口方法handleMessage中處理返回的消息:

public interfaceCallback {
    public boolean handleMessage(Message msg);
}

或者Handler的默認方法handleMessage中處理:

public voidhandleMessage(Message msg) {
}

這兩種唯一的不同在於是否有返回結果,其他一樣!

 

我們先來看看什麼時候調用到了這個方法:

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

唯一的消息分發事件有調用,但是開始的if判斷是什麼鬼?先看看調用的handleCallback方法:

private static voidhandleCallback(Message message) {
    message.callback.run();
}

再深入到Message就知道了這個callbackMessage的全局包變量Runnable的變量名,因爲Runnable的特性(執行後自動銷燬),防止未處理的事件直接返回!再看else後面的消息調用,是先調用Callback的接口方法,爲空或者沒有執行,則調用HandlerhandleMessage方法處理。那麼這個方法是誰再調用呢?首先和Handler相關的也就LooperMessage了(MessageQueue是和Looper綁定的,與Handler關係不緊密),而handleCallback的參數又有Message,所以只能是Looper回調了,具體的調用方法是loop,這裏就不詳細說了!

這篇比較簡潔,Handler的講解主要涉及Handler的初始化,消息發送、消息移除和消息處理,沒有像網上那樣把LooperMessageMessageQueue放在一起,主要集中在Handler本身,下一期講解Message,也是這種模式,等這幾個關聯類講解完了再做一個總結!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章