В чем разнца между 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... Не могу понять, а чем заключается активность этих флоу?

  1. Что за producer code может быть у StateFlow? У обычных Flow есть билдер flow {}, а у StateFlow просто функция StateFlow<T>() в аргумент которой передаётся начальное значение. Что за producer code, если это просто аргумент функции?
  2. Пишут, что StateFlow is always active, но в этом тестовом куске кода без вызова collect() код не выполняется, как и в случае с обычным flow { }. Вероятно, имеется в виду что-то другое под активностью, но я не понимаю что именно.
fun main() = runBlocking {
    val stateFlow = MutableStateFlow(0)
    stateFlow.onEach {
        println(it)
    }.collect() // без collect() код внутри onEach не выполняется
    stateFlow.emit(2)
}

Ответы (1 шт):

Автор решения: Barmaley

Если совсем по простому то "холодный" flow - работает только когда к нему идет обращение. "Горячий" - работает неважно обращаешься к нему или нет.

С точки зрения API:

  • в cold flow, пока не будет вызова терминального оператора: collect/first и т.д. - ничего эмитироваться не будет.
  • в hot flow, эмиссия идет непрерывно, вне зависимости от вызова терминального оператора.
→ Ссылка