1

我想知道何时执行 postDelayed(...) 方法,并且消息队列中有许多消息正在等待。在那种情况下,什么时候运行可运行对象?它会在方法中定义的时间过去之后吗?或者它会等到它的角色进入消息队列?或者是什么... ?

4

1 回答 1

2

让我们检查源代码和文档:

使 Runnable r 添加到消息队列中,在经过指定的时间后运行。可运行对象将在附加此处理程序的线程上运行。时基是 uptimeMillis()。在深度睡眠中花费的时间会增加执行的额外延迟。

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

现在让我们检查一下sendMessageDelayed

在之前的所有未决消息之后将消息排入消息队列(当前时间 + delayMillis)。

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

因此, postDelayed 添加要在所有待处理消息之后但在正常运行时间 + 您放置的延迟之前执行的任务。

检查这个问题以获得更多解释: postDelayed 是否导致消息跳转到队列的前面?

希望它有所帮助。

于 2015-08-05T23:21:37.370 回答