我正在掌握Kotlin协同程序并试图找出1-什么是热流和冷流?2-它们之间的主要区别是什么?3-何时使用每一个?
xe55xuns1#
冷流只有在开始收集价值时才开始产生价值,而热流则立即开始产生价值。我建议阅读以下内容,了解热蒸汽和冷蒸汽的用法:https://balwindersinghrajput.medium.com/complete-guide-to-livedata-and-flow-answering-why-where-when-and-which-6b31496ba7f3https://developer.android.com/kotlin/flow/stateflow-and-sharedflow
lvjbypge2#
此处表单(+)冷流与热流嗯,我真的很难理解这个概念,因为它有点棘手。冷和热的主要区别碰巧很简单:热流在你不在意的时候产生,而在冷流中,如果你不collect()(或者RxJava的等价subscribe()),流根本不会被激活。所以,流就是我们所说的冷流。删除订阅者根本不会产生数据,这使得流成为有史以来最复杂的异步流API之一(在JVM世界中)。
o2g1uqev3#
1.冷流是按需创建的,在被观察时发出数据。热流始终处于活动状态,无论是否被观察,都可以发出数据。1.主要的区别在于,cold流是一种在新订阅者收集时按需执行生产者代码块的流。hot流总是活动的。1.参见Manuel Vivo在“Google Android开发人员”组中的文章中的用法示例:
fzsnzjdm4#
如果流需要一个收集器,冷流就是你所需要的。除非有收集器,否则它不会被触发。每个收集器都有它自己的底层冷流的示例。它被收集,然后就完成了。另一方面,热流并不太关心它是否在那个时刻被收集,它总是在周围(在内存中)直到它被GC'艾德并从可能的多个协程中发出事件。如果各方感兴趣,他们可以通过调用collect订阅,并且所有的收集器将得到从那个热流中发出的相同的事件。就像事件总线一样。与冷流不同,热流总是在内存中,即使没有订阅者/收集者,并且它们在默认情况下是活动的。冷流是懒惰的。然而,热流更适合在多个观察者之间共享状态。如果您有多个收集器共享一个状态,那么您可以选择避免潜在繁重后台操作的状态流。您可以将冷流暴露给UI层(即:到视图模型),然后将其转换为热流(例如,使用shareIn),这将为您提供将热流的范围限定到视图模型的好处。
collect
shareIn
blmhpbnm5#
流被称为“冷”,因为每次在流上调用终端操作符(例如collect)时,它都需要执行生产者代码。
另一方面,“热”流在被收集时不需要执行任何代码,因为在内存中保存了最新的状态。此外,冷流只在有收集器时发射,而热流不关心它,总是发射。
5条答案
按热度按时间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
lvjbypge2#
此处表单(+)
冷流与热流
嗯,我真的很难理解这个概念,因为它有点棘手。冷和热的主要区别碰巧很简单:热流在你不在意的时候产生,而在冷流中,如果你不collect()(或者RxJava的等价subscribe()),流根本不会被激活。所以,流就是我们所说的冷流。删除订阅者根本不会产生数据,这使得流成为有史以来最复杂的异步流API之一(在JVM世界中)。
o2g1uqev3#
1.冷流是按需创建的,在被观察时发出数据。热流始终处于活动状态,无论是否被观察,都可以发出数据。
1.主要的区别在于,cold流是一种在新订阅者收集时按需执行生产者代码块的流。hot流总是活动的。
1.参见Manuel Vivo在“Google Android开发人员”组中的文章中的用法示例:
fzsnzjdm4#
如果流需要一个收集器,冷流就是你所需要的。除非有收集器,否则它不会被触发。每个收集器都有它自己的底层冷流的示例。它被收集,然后就完成了。
另一方面,热流并不太关心它是否在那个时刻被收集,它总是在周围(在内存中)直到它被GC'艾德并从可能的多个协程中发出事件。如果各方感兴趣,他们可以通过调用
collect
订阅,并且所有的收集器将得到从那个热流中发出的相同的事件。就像事件总线一样。与冷流不同,热流总是在内存中,即使没有订阅者/收集者,并且它们在默认情况下是活动的。冷流是懒惰的。然而,热流更适合在多个观察者之间共享状态。
如果您有多个收集器共享一个状态,那么您可以选择避免潜在繁重后台操作的状态流。
您可以将冷流暴露给UI层(即:到视图模型),然后将其转换为热流(例如,使用
shareIn
),这将为您提供将热流的范围限定到视图模型的好处。blmhpbnm5#
冷流:
流被称为“冷”,因为每次在流上调用终端操作符(例如
collect
)时,它都需要执行生产者代码。热流:
另一方面,“热”流在被收集时不需要执行任何代码,因为在内存中保存了最新的状态。
此外,冷流只在有收集器时发射,而热流不关心它,总是发射。