当前位置: 首页 > 面试题库 >

postDelayed是否会导致消息跳到队列的最前面?

方恺
2023-03-14
问题内容

我在寻找android文档中的postDelayed
发布延迟文档

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

我知道每个线程都有一个与之关联的消息队列,循环程序和处理程序。-
什么是Android的尺蠖,处理程序和的MessageQueue之间的关系?。就“在指定的时间段后运行”而言,如果将0作为delayMillis的参数传递,并且消息队列中仍然有消息,则0消息将跳过其余消息(目前位于它的前面),由循环程序直接处理吗?我知道Looper会将消息分派给Handler的handleMessage()方法-从Looper知道如何将消息发送给Handler?。我会自己进行测试,但我真的不知道您会怎么做。


问题答案:

简短的答案是-不,这样做postDelayed不会在队列中其他未延迟的作业之前跳转。

两个postpostDelayed两个呼叫sendMessageDelayedpost使用为0的延迟。因此,postpostDelayed具有零延迟是等效的。(请参见Handlersource,从324行开始)。
sendMessageDelayed指出在所有待处理的请求之后,放入队列中的消息。原因是每个消息都被排队了,同时还加上了可选的延迟。队列按此时间值排序。如果您无延迟地入队新邮件,它将跳过(放在前面)仍未达到其传递时间的延迟消息,但不会在未决消息(已超出传递时间但尚未到达的那些消息)的前面交付)

附带说明一下,如果您 希望
请求跳过未决请求的行为,可以使用postAtFrontOfQueue,但请务必阅读并理解仅在特殊情况下使用的警告。



 类似资料:
  • 我有一个priority_queue,我想修改它的一些内容(优先级值),那么这个队列会被使用吗? 这取决于它是使用Push/Pop(更有可能,因为你只需要“插入”,而不是整个使用),还是访问top或Pop。 我很想更改队列中的一些元素。大概是这样的:

  • 为什么已经拥有了共享内存时需要消息队列呢? 这将是多种原因,让我们将其分解为多个点来简化 - 据了解,一旦消息被一个进程接收到,它将不再可用于任何其他进程。 而在共享内存中,数据可供多个进程访问。 如果想使用小信息格式进行通信。 当多个进程同时进行通信时,共享内存数据需要同步保护。 使用共享内存的写入和读取频率很高,那么实现功能将会非常复杂。 在这种情况下不值得使用。 如果所有的进程不需要访问共享

  • 一、消息模型 点对点 发布/订阅 二、使用场景 异步处理 流量削锋 应用解耦 三、可靠性 发送端的可靠性 接收端的可靠性 参考资料 一、消息模型 点对点 消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。 发布/订阅 消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 发布与订阅模式和观察者模式有以下不同: 观察者模式中,观察者和主题都知道对方的存在;

  • 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: *

  • 消息队列接口 结构体 struct   rt_messagequeue   消息队列控制块 更多...   类型定义 typedef struct rt_messagequeue *  rt_mq_t   消息队列类型指针定义   函数 rt_err_t  rt_mq_init (rt_mq_t mq, const char *name, void *msgpool, rt_size_t msg_

  • rabbitmq 使用 定义handler实体 public class UserEvent : EventHandler { public string Name { get; set; } public string Job { get; set; } } 队列定义 [QueueConsumer(nameof(HelloEventHandler), QueueCon