我们先从最熟悉也是最基本的方法sendMessage(Message msg)来查看,为什么说它是最基本的方法,因为其他发送方法无论是post开头的各种方法还是sendEmptyMessage()本质上都是内部帮我们创建了Message对象,再调用sendMessage(Message msg)来执行的。
当然说它是最基本的方法也不完全正确,因为它实际上是调用了delayMillis为0时的sendMessageDelayed(Message msg, long delayMillis)方法。然后依次调用sendMessageAtTime(@NonNull Message msg, long uptimeMillis),enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg, long uptimeMillis)
Message有同步和异步的区别(默认同步)
handler dispathMessage()方法(runnable,callback ,Message的优先级)
dispatchMessage() 是Looper在loop()循环中执行调用handler处理具体操作的方法,方法很简单如下:
public void dispatchMessage(@NonNull Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
代码中的几个条件语句决定了各个处理方法的优先级,比如Message.callback不为空时优先且只执行Message的callback方法,这种情况很常见,即调用Handler的post(Runnable r),它会将第一个参数runnable封装成一个Message对象并将runnable赋值给Message.callback。
这也很符合人的直观感受,我们当然是想执行该runnable方法,至于Handler的handleMessage(Message msg)方法肯定是不想让它执行的,毕竟从post方法的直观调用上来看我们甚至不知道发送了一个Message到队列中。
执行Message.callback的情况也只有这么一种,因为Message的callback是@UnsupportedAppUsage的无法被我们调用赋值。
然后接下来我们看到还有两处处理具体操作的分别是:mCallback.handleMessage(msg)和handleMessage(msg),逻辑上很简单,优先执行mCallback的handleMessage(msg)方法,再根据其返回值决定是否执行Handler本身的handleMessage(msg)方法。mCallback是Handler的变量,我们对其进行赋值的方法只有创建对象时通过构造方法的参数进行复制,而handleMessage(msg)大家很熟悉了,继承Handler时通过重写实现自己的handleMessage(msg)。