/** * 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内部提供了一个callback接口,实现这个接口提供给handler, 这样的话可以不需要实现一个handler的子类,纳尼???
回想下通常实现一个handler 怎么做,声明一个静态内部类吧,如下:
public static class MyHandler extends Handler {
@Override
public void handleMessage(Message msg){
switch(msg.what){
case...
return;
}
}
}
类似上面这样,
我们知道,Handler默认有一个构造函数提供了一个Looper, 并且这个Looper取的是主线程的looper, 源码片段截取:
public Handler(@Nullable Callback callback, boolean async) {
mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread " + Thread.currentThread() + " that has not called Looper.prepare()"); }
mQueue = mLooper.mQueue; 这个队列是从Looper传过来的,
而Handler遍历的消息队列也是这个mLooper的消息队列,
我们提供这个Callback用来干嘛的呢?
当然是用来处理消息队列里的Message
源码如下:
public void dispatchMessage(@NonNull Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }
这个消息分发的处理,第一步会检查msg是否带有callback这个回调,如果没有就会检查上面说的mCallback是否为空, 不为空的话就会调用这个mCallback了, 那如果这个mCallback也不为空的话,就会调用handleMessage()了,
那看下这个handleMessage在源码中的实现:
/** * Subclasses must implement this to receive messages. */ public void handleMessage(@NonNull Message msg) { }
注释的意思呢是说“子类必须实现这个接收消息”。 事实上这个handleMessage是个空实现,其具体的任务交由子类, 也不是抽象函数,重不重载是可选的额,
在实现一个匿名的handler内部类的时候,就只提供Callback给handler是可以构建出来的。并且也能正常执行,这里自己有一个问题,网上说传private Handler handler = new Handler(Handler.Callback()); 传handler.callback这种写法可以避免内存泄漏, 这样子怎么就规避了匿名内部类的问题呢? 如果有知道的小伙伴请留言讨论下。