В чем разнца между hot и cold flows?
Помогите, пожалуйста, понять разницу между cold и hot flows?
В документации пишут, что the code inside a flow builder does not run until the flow is collected
.
Окей, это легко проверить, потому что можно создать флоу при помощи flow { }
и код внутри { }
действительно не будет выполняться, пока мы не вызовем collect()
.
А в документации по андроиду пишут:
Unlike a cold flow built using the flow builder, a StateFlow is hot: collecting from the flow doesn't trigger any producer code. A StateFlow is always active and in memory...
Не могу понять, а чем заключается активность этих флоу?
- Что за producer code может быть у
StateFlow
? У обычных Flow есть билдерflow {}
, а уStateFlow
просто функцияStateFlow<T>()
в аргумент которой передаётся начальное значение. Что за producer code, если это просто аргумент функции? - Пишут, что
StateFlow is always active
, но в этом тестовом куске кода без вызоваcollect()
код не выполняется, как и в случае с обычнымflow { }
. Вероятно, имеется в виду что-то другое под активностью, но я не понимаю что именно.
fun main() = runBlocking {
val stateFlow = MutableStateFlow(0)
stateFlow.onEach {
println(it)
}.collect() // без collect() код внутри onEach не выполняется
stateFlow.emit(2)
}
Ответы (1 шт):
Если совсем по простому то "холодный" flow - работает только когда к нему идет обращение. "Горячий" - работает неважно обращаешься к нему или нет.
С точки зрения API:
- в cold flow, пока не будет вызова терминального оператора: collect/first и т.д. - ничего эмитироваться не будет.
- в hot flow, эмиссия идет непрерывно, вне зависимости от вызова терминального оператора.