Разделение на холодные (cold) и горячие (hot) потоки — это одна из ключевых концепций реактивного/корутин-флоуного программирования.
Холодный поток (cold) | Горячий поток (hot) | |
|---|---|---|
| Когда начинается | При подписке (collect()) | Начинается независимо от подписчиков |
| Повторное получение | Каждый collector получает свои данные | Все collectors получают одно общее событие |
| Поведение | Как фабрика: «новый клиент — новая история» | Как радио: «идёт независимо, слушаешь — слышишь» |
| Примеры | flow {}, flowOf(), Sequence | StateFlow, SharedFlow, LiveData, callback |
Аналогии
Cold (flow) => Заказ еды в кафе: каждый получает свою порцию
Hot (stateFlow) => Табло в аэропорту: постоянно обновляется, ты просто смотришь
Пример холодного потока — Flow
fun coldFlow(): Flow<Int> = flow {
println("Flow started")
emit(1)
emit(2)
}
runBlocking {
coldFlow().collect { println("C1: $it") }
coldFlow().collect { println("C2: $it") }
}
Вывод:
Flow started
C1: 1
C1: 2
Flow started
C2: 1
C2: 2
Обратите внимание, что поток запускается заново при каждой подписке и collect() запускает producer.
Пример горячего потока — StateFlow
val state = MutableStateFlow(0)
state.value = 1
state.value = 2
state.value = 3
state.collect { println(it) } // увидим только текущее
Вывод:
3 // увидим только текущее
Помните что, Producer уже работает, когда мы подписались. Subscriber получает только актуальное значение.