Android 线程间通信

标签 android

我读过一本书,

“Android 中最常见的线程通信用例是 UI 线程之间 和工作线程。因此,Android平台定义了自己的消息传递 线程之间的通信机制。 UI线程可以卸载长任务 通过发送要在后台线程上处理的数据消息。消息传递机制是一种非阻塞消费者-生产者模式,其中生产者线程和消费者线程在消息传递期间都不会阻塞。”

如何理解“非阻塞”?在我看来,如果消息队列没有消息发送给消费者线程(也许是UI线程),那么消费者线程必须等待,直到有一条消息要获取。

最佳答案

让我们首先了解一下这是什么以及他们的工作。

主线程(UI 线程):- 在 Android 应用程序中,MainThread 或 UI 线程应始终仅用于 UI 操作。 UI 操作如(UI 渲染、UI 更新、UI 事件监听、UI 上的用户操作(如滚动、UI 动画等))

如果您的主线程正在执行任何阻塞操作,例如(在数据库中插入数据、从数据库读取数据或任何其他需要大量时间才能完成的阻塞操作,以 20 秒为例)和

情况 1:- 同时,用户尝试在 UI 上执行某些操作,例如单击按钮或尝试滚动列表,但主线程无法响应用户操作正忙于您未完成的其他操作。因此在这种情况下,android 会等待 5 秒,如果主线程仍然没有响应,则显示 ANR(Android 未响应对话)。

情况 2:- 即使用户没有同时执行任何操作,并且您让主线程忙碌超过 10 秒,Android 也会显示相同的 ANR 对话。

后台线程:-后台线程或工作线程由 Android 应用程序启动,以执行一些繁重的 CPU 密集型工作,以保持主线程空闲以执行 UI 相关工作。

现在回答你的问题,你怀疑主线程是否处于等待状态以获取新消息或任何事件,那么当它处于“非阻塞”状态时,它如何是“非阻塞” >等待'状态? 等待状态并不意味着他因某个特定事件而被阻塞,在等待状态中主线程实际上是空闲的,此时任何人都可以调用他并分配工作。所以等待状态不是阻塞状态,而是非阻塞状态。

关于Android 线程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45604002/

相关文章:

android - 是什么让 QBluetoothDeviceDiscoveryAgent::finished() 被调用?

android - WebView 返回

android - 有什么办法可以减小 PNG 的大小?

android - SEAndroid进程域是如何给定的

android - Kotlin:强制内联方法以保留定义的行数

java - Android 和计算机之间的串行 USB 连接连接错误

android - 在两个 fragment 之间拖放

android - BeanIO - 加载默认流工厂实现类失败

android - RecyclerView 页脚未显示

java - 如何创建可打包的二维可打包数组?