Найти в Дзене
Android Dolgo.polo Dev

Kotlin Flow: StateFlow vs SharedFlow Часть №1

Сначала общие факты для понимания задумки авторов библиотеки Kotlin Flow:
• Flow (потоки) — никак не связаны с Android
это библиотека котлина, которая завязано только на корутины (которые тоже являются библиотекой, не связанной с Android SDK)
• основные методы:
collect() - подписаться на данные из потока
emit() - положить значение в поток
• холодный поток — запускает создание элементов каждый раз при вызове collect()
при объявление потока описывается функция-билдер новых элементов, внутри которого вызывается emit()
то есть для каждого подписчика свой поток данных
• горячий поток — не зависит от вызова collect()
то есть для каждого подписчика один и тот же поток данных
• если корутина, запустившая холодный поток, остановлена — поток тоже остановится
но только если внутри есть проверка флага isActive
• collect() и emit() — suspend-функции, выполнение корутины не продолжится, пока они не завершатся
collect() приостанавливает корутину до завершения потока данных
emit() пр

Сначала общие факты для понимания задумки авторов библиотеки Kotlin Flow:


• Flow (потоки) — никак не связаны с Android
это библиотека котлина, которая завязано только на корутины (которые тоже являются библиотекой, не связанной с Android SDK)


• основные методы:
collect() - подписаться на данные из потока
emit() - положить значение в поток


• холодный поток — запускает создание элементов каждый раз при вызове collect()

при объявление потока описывается функция-билдер новых элементов, внутри которого вызывается emit()

то есть для каждого подписчика свой поток данных


• горячий поток — не зависит от вызова collect()

то есть для каждого подписчика один и тот же поток данных


• если корутина, запустившая холодный поток, остановлена — поток тоже остановится

но только если внутри есть проверка флага isActive


• collect() и emit() — suspend-функции, выполнение корутины не продолжится, пока они не завершатся

collect() приостанавливает корутину до завершения потока данных
emit() приостанавливает корутину до момента, пока поток данных не будет готов принять элемент (освободится буфер)


• CoroutineContext определяется родительской корутиной, вызвавшей collect(). но его можно сменить с помощью оператора flowOn(CouroutineContext)

например, можно получать элементы из Flow в главном потоке, а выполнять их создание в бэкграунде


• зачем нужен буфер?

если речь идет о холодном потоке, то буфер помогает выполнить emit(), не дожидаясь завершения collect()

если речь идет о горячем потоке, то буфер определяет, сколько последних элементов получит новый подписчик, вызвавший collect()