我刚刚看到了三个方法的文档,当我们在工作线程中工作时,它们可以用来在UI线程中执行一段代码。这些方法是:
- public final void runOnUIThread(Runnable action)-在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发送到UI线程的事件队列
- public boolean post(Runnable action)-将Runnable添加到消息队列。runnable将在用户界面线程上运行。
- public boolean postDelayed(Runnable action,long delayMillis)-将Runnable添加到消息队列中,在指定的时间段后运行。runnable将在用户界面线程上运行。
第一个将Runnable发布到UI线程的事件队列中,而另外两个将Runnable添加到消息队列中。请告诉我这两者的区别。
我的网络搜索告诉我,事件队列只是等待线程执行的事件的队列。我不清楚消息队列。MessageQueue也是一个类,这个和那个有关系吗?
先谢谢你。
4条答案
按热度按时间okxuctiv1#
我认为这两者是同义词。使用消息向系统指示事件。
这两种方法之间的真实的区别在于,一种方法立即将其添加到队列中,而另一种方法将其延迟指定的量。
编辑:更多消息
消息是独立线程之间的通信方式。在某种程度上,这很像当你在浏览器中打开一个网站时发生的通信:你向服务器发送一条消息,详细说明你到底想要什么(获取www.stackoverflow.com,我将接受以下字符编码,不要跟踪我,blablabla),这使得作为消息接收者的服务器做一些事情(从数据库中检索内容,呈现页面等),并通过消息将结果传达给你。
它的工作原理是这样的:线程有一个
Looper
连接到它。它所做的就是在一个连续的循环中永远运行,在每次迭代中检查其消息队列中是否有任何消息。如果没有,它将进入下一个周期。如果有,它会检索第一条消息来处理它。然而,looper本身并不知道任何消息的含义--它只是在那里循环。线程也不需要,它只是为循环器提供运行的基础结构。然而,looper知道的是,该去找谁来处理消息:它的一个
Handler
s。它将消息传递给处理程序,处理程序现在可以执行处理消息所需的任何操作。waxmsbnn2#
消息队列和事件队列是非常相似的设计模式,但有一个显著的区别。
首先,让我们回顾一下相似之处。两者都是异步的。它们以FIFO顺序存储通知。发送通知将事件/消息入队并返回。
稍后,
EventManager
/MessageManager
将把所有这些Event
s/Message
s分派给接收对象。不同之处在于,对于MessageQueue
s,发送方通常需要响应。对于EventQueue
,这是不必要的。因此,消息管理为消息的发送者提供了更多的控制。有了事件队列,发送方所能做的就是将请求扔到队列中,然后希望得到最好的结果。
MessageQueue
提供的额外控制带来了一个小的复杂性损失。选择作业所需的最简单的数据结构。
t9eec4r03#
我先说清楚UI线程和用户界面线程是同一线程,事件队列和消息队列是同一队列。
runOnUIThread
和post
之间的共同点是都导致在UI线程上执行Runnable
。两者之间的区别是,
runOnUIThread
在从UI线程调用Runnable
时立即运行Runnable
,而对于post
,总是发布一条消息,导致它在其他消息之后运行。如果你不知道的话,简单的回答是使用
post
,因为如果runOnUIThread
被一个执行runOnUIThread(this)
的Runnable
调用,它将锁定UI线程并导致堆栈溢出。答案来源:来自this page中的活动源代码的代码:
agyaoht74#
正如其他人已经指出的,
event queue
和message queue
在您的情况下是相同的。****然而,一般来说,有一个区别。它们的共同点是
queue
(正如名称所示):一种数据结构,在其中以FIFO顺序放置和获取元素。现在的区别是,是否将
messages
或events
放入该队列。消息和事件有什么区别?
留言
事件
有关消息与事件和事件驱动架构:The Many Meanings of Event-Driven Architecture • Martin Fowler • GOTO Conference 2017 (YouTube)。
消息队列和事件队列有什么区别?
关于同步/异步的第三点**在这里不能帮助我们。**在两个组件之间有一个队列总是意味着通信是异步的(没有等待彼此,它是解耦的!).但前两个可以。
message queue
message queue
event queue
您的队列是消息队列还是事件队列?
在您的示例中,这些元素有明确的收件人:UI线程。该接收者甚至拥有队列,因为措辞泄露了:
如果当前线程不是UI线程,则将操作发布到UI线程的事件队列。
其次,这些元素的发送意图是让UI线程做一些事情-它们字面上是在说“执行这个动作!“
=>这里的队列肯定是
message queue
。总结
这里的第一个方法中的“UI线程的队列”肯定是一个
message queue
-与您发布的其他2个方法中的message queue
相同。文档作者一定是在命名上马虎了。