Sol*_*ace 7 multithreading android message message-queue
我刚刚看到了三种方法的文档,当我们在工作线程中工作时,它们可用于在 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 也是一些类,这与那个有关吗?
先感谢您。
我认为两者是同义词。使用消息向系统指示事件。
两种方法之间的真正区别在于,一种方法立即将其追加到队列中,而另一种方法则将其延迟指定的量。
编辑:有关消息的更多信息
消息是独立线程之间通信的一种方式。在某种程度上,这很像您在浏览器中打开网站时发生的通信:您向服务器发送一条消息,详细说明您到底想要什么(GET www.stackoverflow.com,我将接受以下内容字符编码,不要跟踪我,blablabla),这使得服务器作为消息的接收者执行某些操作(从数据库检索内容,渲染页面等)并通过消息将结果传达给您。
它的工作原理是这样的:线程Looper
上有一个附加的。它所做的就是在连续循环中永远运行,在每次迭代时检查其消息队列中是否有任何消息。如果没有,则进入下一个循环。如果有,它会检索第一条消息来处理它。
然而,循环器本身并不知道任何消息的含义 - 它只是用于循环。线程也不知道,它只是为循环程序提供运行的基础设施。然而,循环程序确实知道去谁那里处理消息:它的其中一个Handler
。它将消息传递给处理程序,处理程序现在可以执行处理消息所需的任何操作。
消息队列和事件队列是非常相似的设计模式,但有一个显着的区别。
首先让我们回顾一下相似之处。两者都是异步的。它们以 FIFO 顺序存储通知。发送通知会将事件/消息排入队列并返回。
稍后EventManager
/MessageManager
会将所有这些Event
s/ Message
s 分派给接收对象。不同之处在于,对于MessageQueue
s,发送者通常需要响应。有了EventQueue
这个就没有必要了。
因此,消息管理为消息发送者提供了更多控制权。对于事件队列,发送者所能做的就是将请求放入队列中并希望得到最好的结果。由 a 提供的额外控制MessageQueue
会带来一些小的复杂性损失。
选择工作所需的最简单的数据结构。