上一節講了Handler的構造和消息發送,這一節繼續Handler的消息移除和消息處理。
一、消息移除
消息移除就是講Message從MessageQueue中移除。先上代碼:
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關聯的Looper的MessageQueue來移除消息,因爲是通過Handler來發送消息,且和Handler綁定,所以在Handler中移除,但處理上沒Handler啥事。就不多說,後期講解到Looper和MessageQueue時會做出說明!和消息移除和消息發送相關還有消息判斷,主要可用的有兩種:
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就知道了這個callback是Message的全局包變量Runnable的變量名,因爲Runnable的特性(執行後自動銷燬),防止未處理的事件直接返回!再看else後面的消息調用,是先調用Callback的接口方法,爲空或者沒有執行,則調用Handler的handleMessage方法處理。那麼這個方法是誰再調用呢?首先和Handler相關的也就Looper和Message了(MessageQueue是和Looper綁定的,與Handler關係不緊密),而handleCallback的參數又有Message,所以只能是Looper回調了,具體的調用方法是loop,這裏就不詳細說了!
這篇比較簡潔,Handler的講解主要涉及Handler的初始化,消息發送、消息移除和消息處理,沒有像網上那樣把Looper、Message、MessageQueue放在一起,主要集中在Handler本身,下一期講解Message,也是這種模式,等這幾個關聯類講解完了再做一個總結!