我刚看到三个方法的文档,这些方法可用于在我们在工作线程中工作时在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也是一些类,这与它有关吗?
提前谢谢。
答案 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线程和用户界面线程是同一个线程,事件队列和消息队列是同一个队列。
runOnUIThread
和 post
之间的共同点是都导致 Runnable
在 UI 线程上执行。
两者的区别在于,runOnUIThread
从UI线程调用时会立即运行Runnable
,而对于post
,总是会发布一条消息,导致它被在其他消息之后运行。
“使用哪个”的简单答案是使用 post
如果您不知道,因为如果 runOnUIThread
使用 Runnable
调用,{{1} },会锁住UI线程,导致栈溢出。
答案来源:来自 this page 中的活动源代码的代码:
runOnUIThread(this)