前言
使用Handler将Message对象插入到MessageQueue后,Looper会将Message从MessageQueue中取出,交给发送Message的Handler进行处理,下面的两个方法,是Message抵达Handler后,被调用的方法,我们一起学习一下
Message对象会先被传递到dispatchMessage()方法中
Message对象会派发到handleMessage()方法中
dispatchMessage()方法分析
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
dispatchMessage()方法是Looper从MessageQueue中取出Message传递给Handler对象进行处理的唯一被调用的方法,Message对象传递到这个方法后,会根据Message对象的状态,执行到不同的方法,我们一起学习一下。
dispatchMessage()方法涉及3种可能的业务逻辑
一、检查传入的Message对象持有的callback
判断传入的Message对象的callback字段是否为null,还记得callback指向的是什么对象吗?callback指向的是Handler的post()系列方法中传入的Runnable对象,所以Handler的post()系列方法提交的Message对象会走到这个代码块里面,此时会再将Message对象传入一个handleCallback()方法中进行处理
二、处理Message对象持有的callback为null时的情况,这里面又会有2种业务逻辑
1、Handler对象实际持有一个mCallback对象
当Handler对象持有的mCallback不为null时,记得mCallback指向的是一个什么对象吗?当我们在创建Handler对象时,构造方法可以传入一个Callback对象会被mCallback持有,Calback是一个interface,内部只定义了一个接口方法,创建的Callback子类对象一会重写其中的handleMessage()方法,回调Callback对象的handleMessage()方法后,并将Message对象传了进去,当handleMessage()方法执行完毕后会检查它的返回值,若为true则会直接return,后面的语句将得不到执行
2、Handler对象持有的mCallback指向一个null或者Callback对象的handleMessage()方法返回false时
就会执行我们经常重写的Handler对象的handleMessage()方法
handleCallback()方法分析
private static void handleCallback(Message message) {
message.callback.run();
}
用于处理Message对象持有一个Runnable对象(callback指向Runnable对象)的方法
1、直接调用了Message对象持有的Runnable对象的run()方法,这样我们每次提交的Runnable对象,重写的run()方法就会得到执行了(作者写的太好了)
handleMessage()方法分析
public void handleMessage(Message msg) {
}
原来在Handler中,这个handleMessage()什么也么有做(空实现),我们的子类重写的就是这个方法,传入的参数为Message对象
Callback接口
public interface Callback {
public boolean handleMessage(Message msg);
}
一个定义在Handler类中的静态内部接口,只定义了一个接口方法,即handleMessage(Message)方法,Handler对象常常可以持有一个Callback对象,当然取决于我们是否传入这个Callback对象!
总结
1、在dispatchMessage()方法中,Handler对象持有的mCallback的handleMessage()方法的返回值会影响Handler中handleMessage()方法的执行
2、当你使用Hander对象时,重写了handleMessage()方法,且又给Handler对象传入一个Callback对象,而Callback对象的handleMessage()方法的返回值又是true,那么你重写的Handler对象的handleMessage()方法将不会得到执行
3、dispatchMessage()方法中,最先可能执行的是Message对象持有的callback(一个Runnable对象),然后是Handler对象持有的mCallback的handleMessage()方法(一个Callback对象),最后才是Handler对象的handleMessage()方法
4、Handler的post系列方法发出的Message是最有可能最优先执行的(因为Message对象会持有一个Runnable对象)、次高执行的是Handler传入的Callback对象、执行优先级最低的是Handler对象重写的handleMessage()方法