Что такое Flow? Чем отличается от Sequence и Suspend-функции?

Flow — это асинхронный стрим данных в Kotlin Coroutines, аналог Rx, но в корутинном стиле. Его важно понимать и уметь отличать от Sequence и suspend-функций.

Flow<T> — это тип, представляющий ленивый асинхронный поток значений, который эмитит (emit) несколько значений во времени, при этом не блокируя поток.

fun numbers(): Flow&lt;Int> = flow {
    for (i in 1..3) {
        emit(i)
        delay(100) // не блокирует поток!
    }
}

Ключевые свойства Flow

  • Cold (холодный) — не начнёт работу, пока не начнёшь collect
  • Асинхронный: delay, network, db внутри flow {} не блокируют
  • Structured concurrency: flow живёт в CoroutineScope

Чем отличается от других?

Сравнениеsuspend funSequenceFlow
Кол-во значенийОдно (T)Много (T)Много (T)
Асинхронностьда (не блокирует)нет (блокирует)да (не блокирует)
Отложенность (lazy)нетдада
ПрерываниеЧерез cancel() scopeнельзячерез collect или scope
Backpressureнетнетподдерживает

Частые ошибки в применении Flow

ОшибкаПочему проблема
flow.collect {} в UI без диспетчераМожет заблокировать UI
collect() без launch в ViewModelБлокирует suspend-функцию
collect() вне скоупаПриведёт к утечке или падению

Опубликовано

в

,

от

Метки: