【问题标题】:Android Flow vs StateFlowAndroid Flow 与 StateFlow
【发布时间】:2021-10-13 07:55:04
【问题描述】:

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

【问题讨论】:

    标签: android kotlin-flow


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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。

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        这不是真的。当应用程序在后台时,Flow 本身不会停止发射。其实Flow接口属于Kotlin的协程,对Android一无所知。

        简单地说,Flow 会在每次发出新值时为您提供一个新值。 StateFlow,除了 Flow 是什么之外,它始终包含一个值。这使得它们非常适合表示状态(顾名思义)。

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

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

        【讨论】:

          猜你喜欢
          • 2022-01-19
          • 2022-11-10
          • 1970-01-01
          • 2020-03-05
          • 1970-01-01
          • 2022-07-22
          • 1970-01-01
          • 1970-01-01
          • 2020-03-12
          相关资源
          最近更新 更多