Холодный и горячий потоки, что это и как использовать.
Холодные потоки (Cold Flows) генерируют данные только тогда, когда у них есть подписчики. Это означает, что каждая подписка на холодный поток начинает выполнение с самого начала, и данные создаются заново для каждого подписчика. Примеры холодных потоков включают Flow
в Kotlin и Observable
в RxJava.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun coldFlow(): Flow<Int> = flow {
for (i in 1..3) {
delay(1000L)
emit(i)
}
}
fun main() = runBlocking {
val flow = coldFlow()
// Первый подписчик
flow.collect { value -> println("Subscriber 1: $value") }
// Второй подписчик
flow.collect { value -> println("Subscriber 2: $value") }
}
В этом примере каждый подписчик получает полный набор значений (1, 2, 3) с задержкой между ними. Когда второй подписчик подписывается, поток начинает генерировать данные с самого начала.
Горячие потоки (Hot Flows) генерируют данные независимо от подписчиков. Это означает, что данные могут поступать и передаваться подписчикам в реальном времени, даже если на момент генерации данных подписчиков не было. Примеры горячих потоков включают StateFlow
, SharedFlow
в Kotlin и Subject
в RxJava.
StateFlow
StateFlow
- это состояние, которое может изменяться и хранит текущее значение, к которому подписчики могут присоединяться в любое время и получать последнее состояние.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val stateFlow = MutableStateFlow(0)
launch {
for (i in 1..3) {
delay(1000L)
stateFlow.value = i
}
}
// Первый подписчик
launch {
stateFlow.collect { value -> println("Subscriber 1: $value") }
}
delay(1500L)
// Второй подписчик
launch {
stateFlow.collect { value -> println("Subscriber 2: $value") }
}
delay(3000L)
}
В этом примере:
stateFlow
изменяет своё значение каждые 1000 миллисекунд.2
, если подписка произошла через 1500 миллисекунд).