通常来讲,使用handler都是继承handler重写handleMessage()方法来处理事件。但是handler可不只有这种方式能够处理事件。handler有三种方式
- Message设置callback
- Handler设置Callback
- 重写handleMessage()
为什么我上面写的两个callback一个大写一个小写,这是有原因的 。Message中的callback是它的一个成员变量,类型是Runnable,而Handler的Callback是一个嵌套类Handler.Callback
那么怎么使用这三种方法来设置事件呢?
- Message设置callback
Message msg = Message.obtain(h1, new Runnable() {
@Override
public void run() {
Log.d(MainActivity.class.getName(), "Message.callback");
}
});
h1.sendMessage(msg);
- Handler设置Callback
Handler h2 = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message paramMessage) {
log("h2.Callback.handleMessage");
return true;
}
});
- 重写handleMessage()
Handler h1 = new Handler() {
public void handleMessage(android.os.Message msg) {
log("h1.handleMessage");
}
};
既然三种方式都可以设置事件,那么它们的优先级,或者说执行流程是怎么样的呢?
- 执行顺序Message.callback > Handler.Callback >Handler.handleMessage()
- 如果Message.callback 不为null,则只执行Message.callback ,就是说Message.callback 可以屏蔽Handler.Callback和Handler.handleMessage()
- 如果Message.callback 为null,且Handler.Callback 不为null,执行Handler.Callback
- 在Message.callback 为null的情况下,如果Handler.Callback为null或者Handler.Callback 不为null但Handler.Callback .handleMessage()返回了false,则执行Handler.handleMessage()
是不是看起来有点头晕。我们直接看Android的源码怎么写的
首先在Looper中
public static void loop() {
...
for (;;) {
//Looper获取到Message
Message msg = queue.next(); // might block
...
//派发这个消息的事件
msg.target.dispatchMessage(msg);
...
msg.recycle();
}
}
然后再去看看Handler的dispatchMessage()
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
//如果Message设置了callback执行完后就直接返回了
handleCallback(msg);
} else {
if (mCallback != null) {
//如果Handler设置了Callback,则调用Callback
if (mCallback.handleMessage(msg)) {
//如果Handler的Callback返回了ture,直接就退出了,执行不到Handler的handleMessage()
return;
}
}
//很明显
handleMessage(msg);
}
}