【发布时间】:2021-10-20 15:10:24
【问题描述】:
我为 Android 开发应用程序。我想知道我一次可以观察多少个 Kotlin Stateflow?我所做的每一个observe 都是在我自己创建、由 IO 调度器调度或由 Android 框架的生命周期组件提供的不同 CoroutineScope 上完成的。
我已经完成了各种操作,例如在协程内的无限循环中进行简单的添加,并使用 Android Studio 分析器,我观察到启动大量执行计算的协程会导致 CPU 负载过高。
考虑到 Stateflow 永远不会完成,它的每一次收集都会阻塞并在不同的 CoroutineScope 上完成,例如示例和文档所说,我一次可以观察到的最大 Stateflow 数量是多少而不打扰我会高度使用 CPU、创建太多线程还是干脆用完设备资源?
【问题讨论】:
-
不应该在现有的
lifecycleScope或viewModelScope上完成收集,因为您通常只想收集依赖于其中一个生命周期的东西吗?我认为您不应该经常需要创建自己的 CoroutineScope。当然有它的应用程序并且它们非常轻量级,但是如果您为收集的每个流都这样做,那是不必要的样板,因为要正确取消它们,那么您需要一个属性来存储每个流并手动在适当的时候全部取消。 -
完全同意@Tenfour04。如果您为每个集合创建新范围,您可能做错了什么。您是否确认您确实在某个时候取消了这些范围?
CoroutineScope()调用绝对不是替代GlobalScope用法。 -
Stateflow 永远不会完成,每一次收集都在阻塞 - 不,它们不是。收集 StateFlow 不会阻塞线程,它像其他挂起函数一样是一个挂起操作,并且可以同时启动许多这些集合。但是,您需要控制要在其中启动此集合的范围。特别是,您应该确保取消与您在其中创建它的组件的生命周期相关联的范围(以避免泄漏)。
-
是的,你们都是对的——当涉及到 android 组件时,我使用他们的
lifecycleScopes。但有时我需要在纯 kotlin 类中使用协程(让我们将该类命名为Collector),例如观察蓝牙或 GPS 等手机组件,然后将信息发送到服务器是否打开或关闭。我从流中收集这些信息,所以在Collector内部我需要创建新的CoroutineScope,这是问题的主要根源,因为我想知道未绑定到 android 组件的观察者。
标签: android multithreading kotlin coroutine stateflow