4 подписчика
Kotlin Flow: StateFlow vs SharedFlow
Часть №1
Сначала общие факты для понимания задумки авторов библиотеки 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()
1 минута
16 сентября 2022