问题:Handler中传递的是什么, post(Runnable r) 和sendMessage(Message msg) 的区别
分析:Looper和MessageQueue一一对应,创建一个Looper的同时,会创建一个MessageQueue。而Handler与它们的关系,只是简单的聚集关系,即Handler里会引用当前线程里的特定Looper和MessageQueue。因此,Handler是在主线程还是在子线程处理消息,主要看创建Handler的Looper是主线程还是子线程。
Handler中传递的是message对象,查看post(Runnable r)方法源码:
public final boolean post(Runnable r)
{
return sendMessageDelayed(getPostMessage(r), 0);
}
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
可以看到,最终传递的还是Message对象
那么问题来了,如果一个handler 重写了handleMessage(Message msg)方法,并且用post(Runnable r)来发送消息,那么handleMessage(Message msg)方法中的代码能执行吗?看Handler是如何分发消息的:
/**
* Handle system messages here.
*/
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
private static void handleCallback(Message message) {
message.callback.run();
}
可以看到,当处理的message对象有callback对象时,执行callback的run方法。