【发布时间】:2021-10-13 07:55:04
【问题描述】:
我最近开始在 Android 中使用 Flows。我读到 Flows 很冷 StateFlows 很热,那么为什么我们更喜欢使用 Android 的 StateFlows 而不是 Flows?使用 Flows 会不会更好,因为它们会在应用程序进入后台时停止生产者?在 Android 开发中是否存在应该在 Stateflow 上使用 Flow 的场景?
【问题讨论】:
标签: android kotlin-flow
我最近开始在 Android 中使用 Flows。我读到 Flows 很冷 StateFlows 很热,那么为什么我们更喜欢使用 Android 的 StateFlows 而不是 Flows?使用 Flows 会不会更好,因为它们会在应用程序进入后台时停止生产者?在 Android 开发中是否存在应该在 Stateflow 上使用 Flow 的场景?
【问题讨论】:
标签: android kotlin-flow
首先,我想提一下,如果您检查源代码的实现,StateFlow 已经实现了 Flow 接口。 StateFlow 是可观察的数据持有者,它始终给出管道的最后一个值。 实际上将它与 LiveData 进行比较是有意义的。你已经对了,它是热的,不像流动是冷的。如果您想在应用程序进入后台时停止生产者,则 Channel API 更适合此目的。 如果我们来了 Flow 的目的是什么,您可以通过 Flow API 处理多个挂起方法。例如:可以连续观察两个suspend函数。
【讨论】:
StateFlow 相对于常规 Flow 的优势是,如果 State 不是所需的状态,则前者将停止浪费资源。
如果您查看the official StateFlow documentation,您会在示例中注意到其中的关键部分,我引用:
// Trigger the flow and start listening for values.
// Note that this happens when lifecycle is STARTED and stops
// collecting when the lifecycle is STOPPED
最后一点很重要。 Hot 流将收集值,只要它启动的范围是已启动的,并且在停止时将停止。这不是普通的 Flow/Livedata 会做的事情,因此会浪费潜在的资源来保持一系列组件的工作,例如,停止 UI。
重要的是要了解LiveData 和StateFlow 相似有两个重要区别(与上述相关,并在链接文档中解释):
StateFlow 需要将初始状态传递给构造函数,而LiveData 不需要。
LiveData.observe() 在视图进入 STOPPED 状态时自动取消注册消费者,而从 StateFlow 或任何其他流收集不会自动停止收集。要实现相同的行为,您需要从Lifecycle.repeatOnLifecycle block 收集流。
换句话说,您可以说StateFlow 是一个可能更高效的 LiveData,它使您能够说:如果状态是 XYZ,则停止收集和使用资源,因为 我有我的理由(例如:我的 UI 不见了,所以我不需要听那些我无法处理的东西)。
【讨论】:
使用 Flows 会不会更好,因为它们会在何时停止生产者 应用程序进入后台?
这不是真的。当应用程序在后台时,Flow 本身不会停止发射。其实Flow接口属于Kotlin的协程,对Android一无所知。
简单地说,Flow 会在每次发出新值时为您提供一个新值。 StateFlow,除了 Flow 是什么之外,它始终包含一个值。这使得它们非常适合表示状态(顾名思义)。
Android 开发中是否存在应该使用 Flows 的场景 在 Stateflow 上?
当您不需要维护价值和关心排放时,您可以使用 Flow。一个例子是按钮按下或用户事件。 StateFlow 可用于表示状态(例如在您的 ViewModel 中)
【讨论】: