【发布时间】:2023-04-03 03:15:01
【问题描述】:
谁能解释一下 Android 中的消息队列是什么?它是正在运行的进程列表吗?我找不到解释它的好来源。
我之所以问,是因为我正在阅读有关 View 类的方法帖子。
在 API 级别 1 中添加 布尔帖子(可运行的操作)
导致 Runnable 添加到 消息队列。可运行的 将在用户界面线程上运行。
提前谢谢你。
【问题讨论】:
标签: android post message-queue
谁能解释一下 Android 中的消息队列是什么?它是正在运行的进程列表吗?我找不到解释它的好来源。
我之所以问,是因为我正在阅读有关 View 类的方法帖子。
在 API 级别 1 中添加 布尔帖子(可运行的操作)
导致 Runnable 添加到 消息队列。可运行的 将在用户界面线程上运行。
提前谢谢你。
【问题讨论】:
标签: android post message-queue
要了解MessageQueue,您需要了解Android应用的执行模型;
就像iOS中的Javascript、Cocoa一样,为了避免并发访问竞争,很多App相关的框架都采用了单线程模型。
这意味着有一个主线程,您将需要完成的工作放入专用于该线程的队列(MessageQueue)中,有一个工作人员(Looper)将从队列中接收您的工作,然后运行它们一个;
这个模型避免了应用程序中的并发冲突;
当你需要做一个长时间的工作时,你应该把工作放到主线程队列中,当它在消息中做你的工作时,你创建一个新线程来做这个长期工作,工作完成后,你把一条新消息从您的新线程进入主线程消息队列;
【讨论】:
简单来说,MessageQueue 是将在某个线程中执行的任务(消息、可运行文件)列表。 Android 系统有一个众所周知的主线程(UI 线程)。您刚刚看到的方法只是将一个 runnable 添加到将在 UI 线程中执行的进程列表中。除了 Looper 和 Handler 之外,MessageQueue 也是 Android 中线程构建块的一部分,它们几乎在系统中的任何地方都使用。
你什么时候会用这个方法?
每当您想从另一个线程更新某些 UI 元素(视图元素)时。也许您正在另一个线程中做一些繁重的工作并想要更新 UI 元素,您无法更新其他线程中的 UI 元素但 UI 线程因此您 post 更改为在 UI 线程中执行。
【讨论】:
Handler 成为话题时,每个人都开始谈论 UI 线程。它们不是专门与 UI 耦合的组件。处理程序将发送要在用于实例化new Handler(Looper) 的线程中执行的任务,如果没有提供活套,它将采用关联线程的活套(如果有)(如果没有活套不与线程关联,则会抛出异常)