Handler解析(二):消息post与sendMessage机制

本文深入解析Handler的post和sendMessage方法,通过源码分析它们的工作原理,包括MessageQueue的enqueueMessage、Looper的loop以及Handler的dispatchMessage。post方法通过包装Runnable并将其放入Message,而sendMessage直接使用Message。两者最终都会进入dispatchMessage处理流程。

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

       上一篇Handler解析(一):是如何实现线程之间的切换分析了Handler线程切换的原理,本篇主要介绍Handler的post机制。

Post与sendMessage方法


首先看看Handler中包含的Post和sendMessage相关的方法

boolean post(Runnable r)
boolean postAtTime(Runnable r, long uptimeMillis)
boolean postAtTime(Runnable r, Object token, long uptimeMillis)
boolean postDelayed(Runnable r, long delayMillis)
boolean postAtFrontOfQueue(Runnable r)

boolean sendMessage(Message msg)
boolean sendMessageDelayed(Message msg, long delayMillis)
boolean sendMessageAtTime(Message msg, long uptimeMillis)
boolean sendMessageAtFrontOfQueue(Message msg)

查看Handler的源码,下面通过源码一一对它们进行分析,看它们的实现原理是怎样的。

post(Runnable r)与sendMessage()


源码分析

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

post方法通过调用getPostMessage()生成一个message,然后调用sendMessageDelayed()

 private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
}

   public final boolean sendMessageDelayed(Message msg, long delayMillis)
    {
        if (delayMillis < 0) {
            delayMillis = 0;
        }
        return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
    }

public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
        MessageQueue queue = mQueue;
        if (queue == null) {
            RuntimeException e = new RuntimeException(
                    this + " sendMessageAtTime() called with no mQueue");
            Log.w("Looper", e.getMessage(), e);
            return false;
        }
        return enqueueMessage(queue, msg, uptimeMillis);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值