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

Ahm*_*lla 36 android kotlin kotlin-coroutines

我正在掌握 Kotlin 协程并试图弄清楚

1-什么是热流和冷流?

2-它们之间的主要区别是什么?

3-什么时候使用每一个?

Bal*_*ngh 32

冷流在开始收集值之前不会开始产生值。另一方面,热流立即开始产生值。

我建议阅读以下内容以了解热蒸汽和冷蒸汽的使用:

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


Ali*_*sel 9

    \n
  1. 冷流是按需创建的,并在观察到它们时发出数据。热流始终处于活动状态,并且无论是否观察到它们\xe2\x80\x99,都可以发出数据。

    \n
  2. \n
  3. 主要区别在于,冷流是一种在新订阅者收集时按需执行生产者代码块的流。热流始终处于活动状态。

    \n
  4. \n
  5. 请参阅“Google Android 开发人员”小组中 Manuel Vivo 的文章中的用法示例:

    \n
  6. \n
\n\n


har*_*850 9

热流:无论侦听器是否存在,事件都会被发出。

现实生活中的例子

你在去电影院看巴本海默的路上遇到了交通堵塞。电影要开始了,放映员不会等你。

冷流:只有在侦听器存在的情况下才会发出事件。

现实生活中的例子

您想在电视上观看点播的《蜘蛛侠 ATSV》。它将根据您的要求(即当您订阅时)为您播放。


Faz*_*Faz 8

在此填写 ( + )

\n
\n

冷流与热流

\n

嗯,我真的很纠结这个概念,因为它有点棘手。冷流和热流之间的主要区别非常简单:当您在冷流中不关心时,就会产生热流,如果您不收集(或 RxJava-s)等效的 subscribe()) 流\nwon\xe2\x80\x99根本不会被激活。因此,Flows 就是我们所说的冷流。删除订阅者根本不会产生数据,这使得 Flows 成为有史以来最复杂的异步流 API(在 JVM 世界中)。

\n
\n


std*_*out 5

如果流体需要一台收集器,那么冷流就是您所需要的。除非有收集器,否则它不会被触发。每个收集器都有自己的底层冷流实例。它被收集起来并完成并消失。

另一方面,热流并不太关心当时是否正在收集它。它始终存在(在内存中),直到被 GC 处理并从可能的多个协程发出事件。如果各方感兴趣,他们可以通过调用 进行订阅collect,并且所有收集器都将获得从该热流发出的相同事件。很像活动巴士。

与冷流不同,即使没有订阅者/收集者并且默认情况下它们处于活动状态,热流也始终位于内存中。冷流是惰性的。但是,热流更适合在多个观察者之间共享状态。

如果您有多个收集器共享一个状态,那么您可以选择状态流,以避免潜在的繁重后台操作。

您可以将冷流暴露给 UI 层(即:视图模型),然后将其转换为热流(例如,使用shareIn),这样您就可以将热流的范围限定到视图模型。