我一次可以观察多少个 Stateflow?
Posted
技术标签:
【中文标题】我一次可以观察多少个 Stateflow?【英文标题】:How many Stateflows can I observe at one time? 【发布时间】: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 组件的观察者。
【参考方案1】:
订阅仍然是协程,协程很便宜。绝对没有我们可以告诉你的普遍界限。
上面的每一个集合都被阻塞
它会暂停,不会阻塞。而且您始终可以使用takeWhile
或类似的方式仅从中收集直到您可以停止,或者您可以取消正在进行收集的协程(例如使用withTimeout
)。
对性能的主要限制是更新MutableStateFlow
所花费的时间与StateFlow
的订阅者数量呈线性关系,因此如果您更新具有一千个订阅者的StateFlow
,它将比仅使用一个订阅者更新 MutableStateFlow
花费大约一千倍的时间。
【讨论】:
嗯,这听起来很清楚,打消了我的疑虑。感谢您的快速响应和提示。以上是关于我一次可以观察多少个 Stateflow?的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin Flow 冷流 StateFlow 热流 StateFlow 的应用
ViewModel中的StateFlow和SharedFlow,使用建议以及单元测试
ViewModel中的StateFlow和SharedFlow,使用建议以及单元测试
深潜Kotlin协程(二十三 完结篇):SharedFlow 和 StateFlow