事件队列和消息队列之间的区别

时间:2014-03-28 12:47:01

标签: android multithreading message message-queue

我刚看到三个方法的文档,这些方法可用于在我们在工作线程中工作时在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将在用户界面线程上运行。

  4. 第一个将Runnable发布到UI线程的事件队列,而另外两个将Runnable添加到消息队列。请告诉我两者之间的区别?

    我的网络搜索告诉我,事件队列只是一个等待线程执行的事件队列。我不清楚消息队列。 MessageQueue也是一些类,这与它有关吗?

    提前谢谢。

3 个答案:

答案 0 :(得分:2)

我认为这两者是同义词。使用消息向系统指示事件。

这两种方法的真正区别在于,它会立即将其附加到队列,而另一种方法会将其延迟指定的数量。

编辑:有关消息的更多信息

消息是独立线程之间的通信方式。在某种程度上,它很像您在浏览器中启动网站时发生的通信:您向服务器发送一条消息,详细说明您想要的内容(获取www.stackoverflow.com,我会接受以下内容)字符编码,不跟踪我,blablabla),这使得服务器作为消息的接收者做某事(从数据库中检索内容,呈现页面等)并通过消息将结果传达给您。 / p>

它是如何工作的:线程附加了Looper。所有这一切都是在一个连续的循环中永远运行,在每次迭代时检查其消息队列中是否有任何消息。如果没有,则进入下一个周期。如果有,它会检索第一条处理它的消息。

然而,looper本身并不知道任何消息的含义 - 它只是用于循环。线程也没有,它只为looper提供了运行的基础设施。然而,looper知道的是要处理消息的人:Handler之一。它将消息传递给处理程序,处理程序现在可以执行任何处理消息所需的操作。

答案 1 :(得分:0)

消息队列和事件队列是非常相似的设计模式,但有一个明显的区别。

首先,让我们回顾一下相似之处。两者都是异步的。它们以FIFO顺序存储通知。发送通知使事件/消息入队并返回。

稍后EventManager / MessageManager会将所有Event / Message分发给接收者对象。区别在于使用MessageQueue s时,发送方通常需要响应。使用MessageQueue则不需要。

因此,邮件管理为邮件的发件人提供了更多控制权。使用事件队列,发送者所能做的就是将请求发送到队列中并希望达到最佳效果。 MessageQueue提供的附加控件带来的复杂性损失很小。

选择工作所需的最简单的数据结构。

答案 2 :(得分:0)

澄清一下:UI线程和用户界面线程是同一个线程,事件队列和消息队列是同一个队列。

runOnUIThreadpost 之间的共同点是都导致 Runnable 在 UI 线程上执行。

两者的区别在于,runOnUIThread从UI线程调用时会立即运行Runnable,而对于post,总是会发布一条消息,导致它被在其他消息之后运行。

“使用哪个”的简单答案是使用 post 如果您不知道,因为如果 runOnUIThread 使用 Runnable 调用,{{1} },会锁住UI线程,导致栈溢出。

答案来源:来自 this page 中的活动源代码的代码:

runOnUIThread(this)