Handler中Callback的作用
通常创建Handler的时候为了能够让Handler处理我们发送的Message,往往开发者选择通过匿名类重写handleMessage()方法
Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
//handler this message
}
};源码中注释也提到,这是留给开发者的一种思路:
/**
* Subclasses must implement this to receive messages.
*/
public void handleMessage(@NonNull Message msg) {
}在创建Handler的几种方法一文中,会发现构造方法中有一个参数是Callback,其实是框架定义的一个接口。在实例化Handler时可以作为参数使用。
/**
* Callback interface you can use when instantiating a Handler to avoid
* having to implement your own subclass of Handler.
*/
public interface Callback {
/**
* @param msg A {@link android.os.Message Message} object
* @return True if no further handling is desired
*/
boolean handleMessage(@NonNull Message msg);
}在Handler、Looper、MessageQueue消息机制原理一文中,我们知道在Looper中loop()方法中循环的时候,会将消息发送会Handler处理:
try {
msg.target.dispatchMessage(msg);
}dispatchMessage(msg)消息分发方法实现如下:
/**
* Handle system messages here.
*/
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,也就是Runnable任务那么直接执行该任务,执行完返回;
否则,如果Handler中的mCallback不为空,先执行Callback处理逻辑。如果Callback返回true那么直接返回,不会回调handleMessage()方法;否则还会执行handleMessage()方法;
如果mCallback为null,那么执行handleMessage()方法,该方法默认空实现,需要开发者在这里重写业务;
直观的逻辑流程图如下:


