Android Flow 与 StateFlow

pvn*_*pvn 15 android kotlin-flow

我最近开始在 Android 中使用 Flows。我读到 Flows 很冷 StateFlows 很热,那么为什么我们应该更喜欢使用 StateFlows for Android 而不是 Flows 呢?使用 Flows 不是更好吗,因为当应用程序进入后台时它们会停止生产者?在 Android 开发中是否存在应该使用 Flows 而不是 Stateflow 的场景?

Mar*_*ini 17

与常规的优势在于,如果国家不是所需的国家,前者将停止浪费资源。StateFlowFlow

如果您查看官方 StateFlow 文档,您会注意到示例中的关键部分,我引用:

// Trigger the flow and start listening for values.
// Note that this happens when lifecycle is STARTED and stops
// collecting when the lifecycle is STOPPED
Run Code Online (Sandbox Code Playgroud)

最后一点很重要。Hot只要启动的范围已启动,就会收集值的流,并且在停止时停止。这不是正常的 Flow/Livedata 会做的事情,因此浪费了潜在的资源来保持一系列组件的工作,例如,在 UI 停止时。

重要的是要理解 和与两个重要区别相似LiveDataStateFlow与上述相关,并在链接文档中进行了解释):

  • StateFlow需要将初始状态传递给构造函数,而不LiveData需要。

  • LiveData.observe()当视图进入 STOPPED 状态时,会自动取消注册使用者,而从 StateFlow 或任何其他流收集不会自动停止收集。要实现相同的行为,您需要从块收集流Lifecycle.repeatOnLifecycle

换句话说,你可以说这StateFlow是一个潜在更高效的 LiveData,它让你能够说:如果状态是 XYZ,那么停止收集和使用资源,因为我有我的理由(例如:我的 UI 消失了,所以我不不需要听我无法处理的东西)。


Ale*_*tyl 10

使用 Flows 不是更好吗,因为当应用程序进入后台时它们会停止生产者?

这不是真的。Flow当应用程序处于后台时,其本身不会停止发射。事实上,该Flow界面属于Kotlin的协程,对Android一无所知。

简而言之,Flow每次发出新值时, a 都会给你一个新值。A StateFlow,除了 aFlow是什么之外,它还始终持有一个值。这使它们成为代表国家的理想选择(顾名思义)。

在 Android 开发中是否存在应该使用 Flows 而不是 Stateflow 的场景?

当您不需要维护值和关心排放时,可以使用 Flow。一个例子是按钮按下或用户事件。AStateFlow对于表示状态很有用(例如在 ViewModel 中)


Ene*_*Zor 0

首先,我想提一下,如果你检查源代码的实现,StateFlow 已经实现了 Flow 接口。StateFlow 是可观察的数据持有者,它始终给出管道的最后一个值。实际上将其与 LiveData 进行比较是有意义的。你已经说得对了,它是热的,不像水流是冷的。如果您想在应用程序进入后台时停止生产者,Channel API 更适合此目的。如果我们知道 Flow 的目的是什么,您可以通过 Flow API 处理多个挂起方法。例如:您可以连续观察两个挂起函数。