Android Handler传递的对象,Message中的Runnable回调

本文深入探讨了Android中Handler的工作原理,包括其如何通过Message对象传递信息,以及post(Runnable r)和sendMessage(Message msg)两种发送消息方式的区别。文章还详细解释了Handler如何分发消息并执行handleMessage方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:Handler中传递的是什么, post(Runnable r) 和sendMessage(Message msg) 的区别

分析:LooperMessageQueue一一对应,创建一个Looper的同时,会创建一个MessageQueue。而Handler与它们的关系,只是简单的聚集关系,即Handler里会引用当前线程里的特定LooperMessageQueue。因此,Handler是在主线程还是在子线程处理消息,主要看创建Handler的Looper是主线程还是子线程。

     Handler中传递的是message对象,查看post(Runnable r)方法源码:

public final boolean post(Runnable r)
    {
       return  sendMessageDelayed(getPostMessage(r), 0);
    }
private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
    }

可以看到,最终传递的还是Message对象

那么问题来了,如果一个handler 重写了handleMessage(Message msg)方法,并且用post(Runnable r)来发送消息,那么handleMessage(Message msg)方法中的代码能执行吗?看Handler是如何分发消息的:

   /**
     * Handle system messages here.
     */
    public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }
private static void handleCallback(Message message) {
        message.callback.run();
    }

可以看到,当处理的message对象有callback对象时,执行callback的run方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值