为什么Handler提供了一个Callback接口

/**
 * 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这种写法可以避免内存泄漏, 这样子怎么就规避了匿名内部类的问题呢?  如果有知道的小伙伴请留言讨论下

 

  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值