kotlin 协程中的热流和冷流是什么?它们之间的区别是什么?

bttbmeg0  于 2023-01-26  发布在  Kotlin
关注(0)|答案(5)|浏览(557)

我正在掌握Kotlin协同程序并试图找出
1-什么是热流和冷流?
2-它们之间的主要区别是什么?
3-何时使用每一个?

xe55xuns

xe55xuns1#

冷流只有在开始收集价值时才开始产生价值,而热流则立即开始产生价值。
我建议阅读以下内容,了解热蒸汽和冷蒸汽的用法:
https://balwindersinghrajput.medium.com/complete-guide-to-livedata-and-flow-answering-why-where-when-and-which-6b31496ba7f3
https://developer.android.com/kotlin/flow/stateflow-and-sharedflow

lvjbypge

lvjbypge2#

此处表单(+
冷流与热流
嗯,我真的很难理解这个概念,因为它有点棘手。冷和热的主要区别碰巧很简单:热流在你不在意的时候产生,而在冷流中,如果你不collect()(或者RxJava的等价subscribe()),流根本不会被激活。所以,流就是我们所说的冷流。删除订阅者根本不会产生数据,这使得流成为有史以来最复杂的异步流API之一(在JVM世界中)。

o2g1uqev

o2g1uqev3#

1.流是按需创建的,在被观察时发出数据。流始终处于活动状态,无论是否被观察,都可以发出数据。
1.主要的区别在于,cold流是一种在新订阅者收集时按需执行生产者代码块的流。hot流总是活动的。
1.参见Manuel Vivo在“Google Android开发人员”组中的文章中的用法示例:

fzsnzjdm

fzsnzjdm4#

如果流需要一个收集器,冷流就是你所需要的。除非有收集器,否则它不会被触发。每个收集器都有它自己的底层冷流的示例。它被收集,然后就完成了。
另一方面,热流并不太关心它是否在那个时刻被收集,它总是在周围(在内存中)直到它被GC'艾德并从可能的多个协程中发出事件。如果各方感兴趣,他们可以通过调用collect订阅,并且所有的收集器将得到从那个热流中发出的相同的事件。就像事件总线一样。
与冷流不同,热流总是在内存中,即使没有订阅者/收集者,并且它们在默认情况下是活动的。冷流是懒惰的。然而,热流更适合在多个观察者之间共享状态。
如果您有多个收集器共享一个状态,那么您可以选择避免潜在繁重后台操作的状态流。
您可以将冷流暴露给UI层(即:到视图模型),然后将其转换为热流(例如,使用shareIn),这将为您提供将热流的范围限定到视图模型的好处。

blmhpbnm

blmhpbnm5#

冷流:

流被称为“冷”,因为每次在流上调用终端操作符(例如collect)时,它都需要执行生产者代码。

热流:

另一方面,“热”流在被收集时不需要执行任何代码,因为在内存中保存了最新的状态。
此外,冷流只在有收集器时发射,而热流不关心它,总是发射。

相关问题