【问题标题】:Does postDelayed cause the message to jump to the front of the queue?postDelayed 是否会导致消息跳到队列的前面?
【发布时间】:2015-01-30 03:28:04
【问题描述】:

我正在查看有关 postDelayed 的 Android 文档 post delayed documentation

这类似于另一个问题 - https://stackoverflow.com/questions/25820528/is-postdelayed-relative-to-when-message-gets-on-the-queue-or-when-its-the-actual - 我有一段时间了,但情况不同(并且在我的脑海中措辞更加清晰)

基本上这是文档对这个方法所说的 - “导致 Runnable 被添加到消息队列中,在指定的时间过去后运行。runnable 将在用户界面线程上运行。”

我知道每个线程都有一个与之关联的消息队列、循环器和处理程序。 -What is the relationship between Looper, Handler and MessageQueue in Android?。 就“经过指定的时间后运行”而言,如果您将 0 作为 delayMillis 的参数传入并且消息队列中仍有消息,那么带有 0 的消息是否会跳过其余消息(即目前在它前面)在Message Queue中由looper直接处理?我知道 looper 会将消息从How the Looper knows to send the message to Handler? 发送到处理程序的handleMessage() 方法。我会自己测试这个,但我真的不知道你会怎么做。

【问题讨论】:

    标签: java android multithreading handler


    【解决方案1】:

    简短的回答是 - 不,执行postDelayed 不会跳到队列中其他非延迟作业的前面。

    postpostDelayed 都调用 sendMessageDelayedpost 使用延迟为 0。因此,postpostDelayed 延迟为零是等效的。 (参见Handler source,从第 324 行开始)。 sendMessageDelayed 声明消息在所有未决请求之后放入队列。原因是每条消息都以它入队的时间加上一个可选的延迟入队。队列按此时间值排序。如果您将一条新消息毫无延迟地排入队列,它将跳过(放置在其前面)尚未到达其传递时间的延迟消息,但不在待处理消息之前(那些已超过其传递时间但尚未到达的消息)已交付)

    附带说明,如果您想要请求跳过待处理请求的行为,您可以使用postAtFrontOfQueue,但请务必阅读并理解它仅用于特殊情况。

    【讨论】:

    • 谢谢,但我认为一个例子会更清楚。假设我调用 postDelayed(new Runnable() { .... } , 50000)。这最初会放在消息队列的前面,因为消息队列中没有其他内容。如果我添加另一个可运行对象,例如 post(new Runnable() {...}),那么该可运行对象是否必须等待 50 秒,因为第一个帖子的“阻塞操作”是因为第一个帖子必须等待那么长时间才能执行?
    • 不,队列的顺序是由与消息关联的时间决定的。对于非延迟消息,这是当前时间。对于延迟消息,它是当前时间加上延迟。因此,如果您将一条新消息毫无延迟地排入队列,它将跳过(放置在其前面)仍未达到其传递时间的延迟消息。更新了我的答案以提供此详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2012-10-25
    相关资源
    最近更新 更多