Handler的postDelayed流程

Handler的postDelayed方法通过sendMessageDelayed实现,它将Runnable封装为Message并计算执行时间。消息会被添加到MessageQueue,Looper通过next方法根据延迟时间从队列中取出并执行。
AI助手已提取文章相关产品:

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

Handler的post系列方法用来执行一个线程。

比如:

mhandler.postDelayed(runnable, 1000);

Handler的postDelayed方法其实也是通过sendMessageDelayed方法实现的。

public final boolean postDelayed(Runnable r, long delayMillis)
{
    return sendMessageDelayed(getPostMessage(r), delayMillis);
}

Runnable参数经过getPostMessage方法封装成一个Message。

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

sendMessageDelayed方法会对延迟时间进行处理,即当前时间加延迟的时间,就是这个消息需要执行的时间了。SystemClock.uptimeMillis()表示从开机到现在的毫秒数

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

之后调用MessageQueue的enqueueMessage方法,传入此Message和延迟时间。将此消息插入消息队列中。参数wen即为传入的延迟时间。

boolean enqueueMessage(Message msg, long when) {}

最后Looper通过调用MessageQueue的next方法从消息队列中取出消息。

在MessageQueue的next方法中,会判断当前时间是否小于延长时间,如果小于,则计算出剩余时间,调用nativePollOnce(ptr, nextPollTimeoutMillis)进行阻塞。

Message next() {
    for (;;) {
        nativePollOnce(ptr, nextPollTimeoutMillis);
        synchronized (this) {
            if (msg != null) {
                if (now < msg.when) {
                    nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE);
                } 
            }
    }
}

 

您可能感兴趣的与本文相关内容

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值