【问题标题】:Difference between event queue and message queue事件队列和消息队列的区别
【发布时间】:2014-05-07 22:37:33
【问题描述】:

我刚刚看到了三种方法的文档,当我们在工作线程中工作时,这些方法可用于在 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 也是一个类,和那个有关系吗?

提前谢谢你。

【问题讨论】:

    标签: android multithreading message message-queue


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 哦,这让我想到了什么是消息。我试图了解消息、消息队列、处理程序、循环器等是什么,但我不太明白。我是初学者。
    • " 两者是同义词" 谢谢。
    • 我在我的答案中添加了一篇关于消息和处理程序的文章。希望有帮助
    • 真的很有用。我非常感激。
    【解决方案2】:

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

    首先让我们回顾一下相似之处。两者都是异步的。他们以先进先出的顺序存储通知。发送通知会将事件/消息排入队列并返回。

    稍后EventManager/MessageManager 会将所有这些Events/Messages 发送给收件人对象。不同之处在于MessageQueues 通常发件人需要回复。对于EventQueue,这是不必要的。

    因此,消息管理为消息的发送者提供了更多控制权。使用事件队列,发送者所能做的就是在队列中抛出一个请求并希望得到最好的结果。 MessageQueue 提供的额外控制会带来少量复杂性损失。

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

    【讨论】:

    • 我喜欢这样的定义:“不同之处在于,对于 MessageQueue,发送方通常需要响应。对于 EventQueue,这不是必需的。”
    【解决方案3】:

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

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

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

    “使用哪一个”的简单答案是使用post,如果您不知道,因为如果使用Runnable 调用runOnUIThread 来执行runOnUIThread(this),它将锁定UI 线程并导致堆栈溢出。

    答案来源:this page 中的 Activity 源代码中的代码:

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

    【讨论】:

      猜你喜欢
      • 2018-10-08
      • 2016-01-27
      • 2018-09-18
      • 1970-01-01
      • 2022-10-05
      • 2019-07-25
      • 2018-08-04
      • 1970-01-01
      • 2017-04-14
      相关资源
      最近更新 更多