android 事件队列和消息队列的区别

rpppsulh  于 2023-05-27  发布在  Android
关注(0)|答案(4)|浏览(205)

我刚刚看到了三个方法的文档,当我们在工作线程中工作时,它们可以用来在UI线程中执行一段代码。这些方法是:

  1. public final void runOnUIThread(Runnable action)-在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发送到UI线程的事件队列
  2. public boolean post(Runnable action)-将Runnable添加到消息队列。runnable将在用户界面线程上运行。
  3. public boolean postDelayed(Runnable action,long delayMillis)-将Runnable添加到消息队列中,在指定的时间段后运行。runnable将在用户界面线程上运行。
    第一个将Runnable发布到UI线程的事件队列中,而另外两个将Runnable添加到消息队列中。请告诉我这两者的区别。
    我的网络搜索告诉我,事件队列只是等待线程执行的事件的队列。我不清楚消息队列。MessageQueue也是一个类,这个和那个有关系吗?
    先谢谢你。
okxuctiv

okxuctiv1#

我认为这两者是同义词。使用消息向系统指示事件。
这两种方法之间的真实的区别在于,一种方法立即将其添加到队列中,而另一种方法将其延迟指定的量。

编辑:更多消息

消息是独立线程之间的通信方式。在某种程度上,这很像当你在浏览器中打开一个网站时发生的通信:你向服务器发送一条消息,详细说明你到底想要什么(获取www.stackoverflow.com,我将接受以下字符编码,不要跟踪我,blablabla),这使得作为消息接收者的服务器做一些事情(从数据库中检索内容,呈现页面等),并通过消息将结果传达给你。
它的工作原理是这样的:线程有一个Looper连接到它。它所做的就是在一个连续的循环中永远运行,在每次迭代中检查其消息队列中是否有任何消息。如果没有,它将进入下一个周期。如果有,它会检索第一条消息来处理它。
然而,looper本身并不知道任何消息的含义--它只是在那里循环。线程也不需要,它只是为循环器提供运行的基础结构。然而,looper知道的是,该去找谁来处理消息:它的一个Handler s。它将消息传递给处理程序,处理程序现在可以执行处理消息所需的任何操作。

waxmsbnn

waxmsbnn2#

消息队列和事件队列是非常相似的设计模式,但有一个显著的区别。
首先,让我们回顾一下相似之处。两者都是异步的。它们以FIFO顺序存储通知。发送通知将事件/消息入队并返回。
稍后,EventManager/MessageManager将把所有这些Event s/Message s分派给接收对象。不同之处在于,对于MessageQueue s,发送方通常需要响应。对于EventQueue,这是不必要的。
因此,消息管理为消息的发送者提供了更多的控制。有了事件队列,发送方所能做的就是将请求扔到队列中,然后希望得到最好的结果。MessageQueue提供的额外控制带来了一个小的复杂性损失。
选择作业所需的最简单的数据结构。

t9eec4r0

t9eec4r03#

我先说清楚UI线程和用户界面线程是同一线程,事件队列和消息队列是同一队列。
runOnUIThreadpost之间的共同点是都导致在UI线程上执行Runnable
两者之间的区别是,runOnUIThread在从UI线程调用Runnable时立即运行Runnable,而对于post,总是发布一条消息,导致它在其他消息之后运行。
如果你不知道的话,简单的回答是使用post,因为如果runOnUIThread被一个执行runOnUIThread(this)Runnable调用,它将锁定UI线程并导致堆栈溢出。
答案来源:来自this page中的活动源代码的代码:

public final void runOnUiThread(Runnable action) {
  if (Thread.currentThread() != mUiThread) {
    mHandler.post(action);
  } else {
    action.run();
  }
}
agyaoht7

agyaoht74#

正如其他人已经指出的,event queuemessage queue在您的情况下是相同的。****然而,一般来说,有一个区别。
它们的共同点是queue(正如名称所示):一种数据结构,在其中以FIFO顺序放置和获取元素。
现在的区别是,是否将messagesevents放入该队列。

消息和事件有什么区别?

留言

  • 有一个明确的,* 可寻址的收件人 *
  • 通常是发送 * 意图让收件人知道或让他做某事 *(“做xyz!“)
  • 可以是 * 同步或异步 *
    事件
    • 没有接收者 *,只是放在某个地方(其他人可以听到并可能做出React)
  • 是一个纯粹的声明,说发生了什么事,* 没有通知任何人的意图 *。制片人不在乎谁听这些事件,他不需要知道。(“xyz发生了。”)
  • 总是 * 异步 *

有关消息与事件和事件驱动架构:The Many Meanings of Event-Driven Architecture • Martin Fowler • GOTO Conference 2017 (YouTube)

消息队列和事件队列有什么区别?

关于同步/异步第三点**在这里不能帮助我们。**在两个组件之间有一个队列总是意味着通信是异步的(没有等待彼此,它是解耦的!).但前两个可以。

  • 如果队列中的元素有一个clear recipient->,则它是一个message queue
  • 如果发送队列中的元素时带有意图让接收者做某些事情->,则为message queue
  • else ->是event queue

您的队列是消息队列还是事件队列?

在您的示例中,这些元素有明确的收件人:UI线程。该接收者甚至拥有队列,因为措辞泄露了:
如果当前线程不是UI线程,则将操作发布到UI线程的事件队列
其次,这些元素的发送意图是让UI线程做一些事情-它们字面上是在说“执行这个动作!“
=>这里的队列肯定是message queue

总结

这里的第一个方法中的“UI线程的队列”肯定是一个message queue-与您发布的其他2个方法中的message queue相同。文档作者一定是在命名上马虎了。

相关问题