Android之Handler源码分析(第四篇:分派消息与处理消息)

前言

    使用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()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值