Handler深入解析(二)

上一节讲了Handler的构造和消息发送,这一节继续Handler的消息移除和消息处理。

 

一、消息移除

消息移除就是讲MessageMessageQueue中移除。先上代码:

public final voidremoveMessages(intwhat) {
    mQueue.removeMessages(this, what,null);
}

public final voidremoveMessages(intwhat, Object object) {
    mQueue.removeMessages(this, what, object);
}

public final voidremoveCallbacks(Runnable r)
{
    mQueue.removeMessages(this, r,null);
}

public final voidremoveCallbacks(Runnable r, Object token)
{
    mQueue.removeMessages(this, r, token);
}

public final voidremoveCallbacksAndMessages(Object token) {
    mQueue.removeCallbacksAndMessages(this, token);
}

主要是通过与Handler关联的LooperMessageQueue来移除消息,因为是通过Handler来发送消息,且和Handler绑定,所以在Handler中移除,但处理上没Handler啥事。就不多说,后期讲解到LooperMessageQueue时会做出说明!和消息移除和消息发送相关还有消息判断,主要可用的有两种:

public final booleanhasMessages(intwhat) {
    return mQueue.hasMessages(this, what,null);
}

public final booleanhasMessages(intwhat, Object object) {//低版本好像没有
    return mQueue.hasMessages(this, what, object);
}

最终也都是通过消息队列(MessageQueue)来处理!

Handler还提供了获取关联Looper的方法:

public finalLooper getLooper() {
    return mLooper;
}

因为MessageQueue是和Looper绑定的,所以获取MessageQueue是通过Looper来获取,Handler也就没有提供对应的方法,从MessageQueue的初始化也可以看出!

二、消息处理

终于说到消息处理,我们用到的消息处理无外乎两种,实现Callback接口,在接口方法handleMessage中处理返回的消息:

public interfaceCallback {
    public boolean handleMessage(Message msg);
}

或者Handler的默认方法handleMessage中处理:

public voidhandleMessage(Message msg) {
}

这两种唯一的不同在于是否有返回结果,其他一样!

 

我们先来看看什么时候调用到了这个方法:

public voiddispatchMessage(Message msg) {
    if (msg.callback != null) {
        handleCallback(msg);
    } else {
        if (mCallback!=null) {
            if (mCallback.handleMessage(msg)) {
                return;
            }
        }
        handleMessage(msg);
    }
}

唯一的消息分发事件有调用,但是开始的if判断是什么鬼?先看看调用的handleCallback方法:

private static voidhandleCallback(Message message) {
    message.callback.run();
}

再深入到Message就知道了这个callbackMessage的全局包变量Runnable的变量名,因为Runnable的特性(执行后自动销毁),防止未处理的事件直接返回!再看else后面的消息调用,是先调用Callback的接口方法,为空或者没有执行,则调用HandlerhandleMessage方法处理。那么这个方法是谁再调用呢?首先和Handler相关的也就LooperMessage了(MessageQueue是和Looper绑定的,与Handler关系不紧密),而handleCallback的参数又有Message,所以只能是Looper回调了,具体的调用方法是loop,这里就不详细说了!

这篇比较简洁,Handler的讲解主要涉及Handler的初始化,消息发送、消息移除和消息处理,没有像网上那样把LooperMessageMessageQueue放在一起,主要集中在Handler本身,下一期讲解Message,也是这种模式,等这几个关联类讲解完了再做一个总结!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值