小智 67
Flow 是冷的!,意味着它仅在收集数据时才发出数据。另外Flow不能保存数据,可以把它看成是水在里面流动的管道,Flow中的数据只是流动,不存储(没有.value功能)。
与 Flow 不同,StateFlow 和 SharedFlow 是热流,这意味着即使没有收集器,它们也会发出数据。此外,如果有多个收集器,将为每个收集器运行一个新的流程,彼此完全独立。SharedFlow 和 StateFlow 是允许在多个收集器之间共享自身的流,因此对于所有同时收集器来说,只有一个流有效运行。如果你定义了一个访问数据库的SharedFlow,并且它被多个收集器收集,那么数据库访问只会运行一次,并且结果数据将共享给所有收集器。
SharedFlow 和 StateFlow 有什么区别?
状态流
Stateflow 通过构造函数获取初始值,并在有人开始收集时立即发出它。Stateflow 与 LiveData 几乎相同。当视图进入 STOPPED 状态时,LiveData 会自动取消注册使用者。当收集 StateFlow 时,这不会自动处理,如果您想在 STOPPED 状态取消注册使用者,可以使用 RepeatOnLifeCyCle 作用域。如果您想要当前状态,请使用 stateflow(.value)。
共享流
StateFlow 仅发出最后一个已知值,而 SharedFlow 可以配置要发出的先前值的数量。如果您想要发出和收集重复值,请使用共享流。
概括
总之,当您需要管理和与多个收集器共享单个状态时,请使用 StateFlow。相反,当您需要在收集器之间共享事件流而不保留任何状态时,请使用 SharedFlow。
Ten*_*r04 15
StateFlow 是 SharedFlow 的子类型,具有更多受限制的配置选项(使其设置更简单且性能更好),但它增加了一个value属性。
StateFlow 的value属性代表其当前值,可以从任何地方检查,包括协程外部。在 MutableStateFlow 中,您还可以通过设置此value属性从流中发出值,甚至可以从任何协程外部发出值。MutableSharedFlow 有一个tryEmit()可以从外部协程使用的函数,但调用时是否成功取决于当前状态和缓冲区配置。另一方面,设置MutableStateFlow.value 总是成功的。
单个当前值这一概念的存在意味着 SharedFlow 的某些可配置功能不可用,因为它们会破坏该概念。以下是一些限制:
replay为 1,因为只有 1 个当前值。distinctUntilChanged()在基础 SharedFlow 上强制执行操作符一样。如果您的流逻辑必须监视某些内容或执行 IO,并且您希望在存在多个可能的收集器时避免重复这项耗时的工作,那么像 SharedFlow 和 StateFlow 这样的热流非常有用。在 Android 上,它可用于在屏幕旋转期间保留流,在此期间收集器可能会被销毁,并创建新的收集器来收集相同的流。
And*_*Dev 10
SharedFlow 和 StateFlow 之间的主要区别在于,StateFlow 通过构造函数获取默认值,并在有人开始收集时立即发出该值,而 SharedFlow 不获取任何值,并且默认情况下不发出任何内容。
| 归档时间: |
|
| 查看次数: |
20599 次 |
| 最近记录: |