Android学习碎片(三)——Handler、Message、Runnable之间的联系①

个人对Android了解较为粗浅,如有谬误,敬请拍砖。


Handler类怎么发送消息到消息队列里暂且不管,今天先看Handler怎么处理消息。

Handler要处理消息首先会分发消息,即通过它的dispatchMessage(Message msg)方法,其源码如下:


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


先简单理一下这个方法包含的内容。

参数msg为被分发的Message对象。方法结构体是一个逻辑判断,首先判断msg的callback(属于Runnable类)为不为空值。如果不为空值,则执行handlerCallback(msg)方法,这个方法实际上就是执行callback的run方法。如果callback为空值,则接着判断Handler的mCallback(Handler的一个内部接口类)为不为空值,如果mCallback不为空值,则由它的handleMessage方法处理msg再根据其返回值决定是否由Handler的handleMessage方法继续处理msg,如果mCallback为空值,则直接由Handler处理msg。


根据dispatchMessage的消息处理流程可以分几种情况简单应用。

当我们只需要开启一个子线程,处理一下UI事件的时候,我们可以直接使用Handler类的post(Runnable r)方法,其源码如下:


    public final boolean post(Runnable r)
    {
       return  sendMessageDelayed(getPostMessage(r), 0);
    }

这个方法实际上是使用sendMessageDelayed方法发送消息,只不过延迟时间为0。再看一下getPostMessage(r)的源码:


    private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
    }
实际上就是实例化了一个Message对象,再初始化了callback对象而已。当Handler分发消息,即执行dispatchMessage方法的时候,由于msg的callback不为空值则会执行handleCallback方法,handleCallback的源码如下:
    private static void handleCallback(Message message) {
        message.callback.run();
    }
一目了然,这个方法最终还是执行的是callback的run方法。

同样是依靠callback处理消息,还可以用另外一种方式来实现,即直接实例一个Message对象,再初始化其callback对象。而初始化其callback对象,必须通过Message的静态方法obtain(Handler h, Runnable callback)初始化才行,其源码如下:

    public static Message obtain(Handler h, Runnable callback) {
        Message m = obtain();
        m.target = h;
        m.callback = callback;

        return m;
    }
在这个方法里初始化了一个Message对象,然后为它初始化了target和callback,target就是Handler对象。初始化完后接着发送消息,这里不需要重新new一个Handler对象,只需要使用Message的sendToTarget方法就行了,sendToTarget的源码如下:

    public void sendToTarget() {
        target.sendMessage(this);
    }
就是使用刚才初始化的target发送消息。
想要获得Message的target和callback可以通过getTarge方法和getCallback方法。


当需要根据 不同的消息来处理事件的时候,Runnable就不好用了,我们需要实现Handle的成员接口类Callback或者继承Handler来处理。

前面讲了,当Handler的mCallback对象不为空时,需要根据mCallback接口的handleMessage方法的返回值来决定是否继续由Handler处理消息。mCallback的是Callback类,源码如下:

    public interface Callback {
        public boolean handleMessage(Message msg);
    }
它是个接口类,需要我们自己实现它的方法,我们自己决定handleMessage的返回值。当我们决定返回true的时候,就只有Callback处理消息;当我们决定返回false的时候,消息还会由Handler继续处理。


所以只有当各种条件都满足的时候,才会由Handler的handleMessage来处理Message。它的源码如下:

    public void handleMessage(Message msg) {
    }
不要怀疑你的眼睛,源码就是这样,这个方法什么都没做。

所以当我们需要用Handler的handleMessage来处理消息的时候,我们必须继承Handler类重写这个方法。


关于Handler、Meesage、Runnable之间的联系先就写这么多,下次有空接着学习。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值