为了活动小家电-Android Thread和Handler(五)

55 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

为了活动小家电,接着上篇搞!

消息队列

MessageQueue 是一种包含消息的数据结构,并被实现为具有链接结构的队列,该结构限制了消息的数量并允许轻松的中间插入速度。当你需要做一个长时间的工作时,你应该把工作放到主线程队列中,当它在消息中做你的工作时,你创建一个新线程来做这个长期工作,工作完成后,你放一条新消息从新线程进入主线程消息队列;这意味着有一个主线程,您将需要完成的工作放入专用于该线程的队列(MessageQueue)中,有一个工人(Looper)将从队列中接收您的工作,一一运行它们;该模型避免了应用程序中的并发冲突;

消息队列中的队列

下面说说-delayed()对排队的影响。如果当前时间是10,handler.postDelayed(runnable, 200); 被调用,runnable什么时候插入MessageQueue并执行?

  • enqueue > 是先插入后延迟 200 吗?200延迟后会插入吗?

  • dispatch > 发货顺序是什么?

  • 正确答案是 -delayed 在 10 处排队,这会导致任务在当前时间 (uptimeMillies, 10) + delayMillis(200) 之后调度,即在 200 (或 200 之后)。

  • -delayed 在内部调用 -AtTime。即**-delayed (uptimeMillies) + delayMillis 的当前时间输入到-AtTime 的 uptimeMillies 参数中**。

  • 被调用的 handler.postDelayed(runnable, 200) 内部调用 handler.postAtTime(runnable, 210)。

  • 在内部,MessageQueue 的 msg、runnable sort 和 deep sleep 使任务在一定时间(uptimeMillies、timestamp)之后分派。

  • MessageQueue之所以使用链接结构,也与基于时间戳进行排序并插入中间有关。

消息按照执行时间戳的顺序插入到MessageQueue中,通过链接连接,从最早到最早顺序检索。 执行时间在 post() 和 send() 方法中传递,即使稍后调用,如果时间戳提前,它也会插入到队列中间。这就是我们使用易于插入的链接结构的原因。