4 подписчика
Kotlin Flow: StateFlow vs SharedFlow
Часть №2
Общее для StateFlow и SharedFlow:
• это горячие потоки
то есть вызов collect() лишь позволяет собрать данные, которые уже в них есть или поступят в них, но не запускает выполнение какого-либо билдера (как это происходит с холодными потоками)
• они не отслеживает жизненный цикл активити\фрагмента\вьюшки
но их можно запустить в корутинах, которые автоматически остановятся во время вызова onStop(). остановка \корутины вызывает остановку выполнения collect()
• при создании нужно указать начальное значение
Отличия StateFlow и SharedFlow:
• у SharedFlow можно настроить вместимость буфера, у StateFlow хранится только 1 последний элемент
У SharedFlow два буфера — replayBuffer и extraBuffer:
• replay — сколько новый подписчик, вызвавший collect(), получит последних выпущенных элементов
• extraBuffer — сколько дополнительно элементов сохранится для "медленного" подписчика, который не успевает выполнять collect()
этот буфер работает в следующей ситуации:
допустим, emit() вызывается каждые 100мс, а collect() выполняется за 150мс
• onBufferOverflow — определяет, что делать, когда вызывается emit() при полностью заполненном extraBuffer
сценарии:
SUSPEND (остановить корутину на строчке emit, пока не освободится буфер)
DROPLATEST (удалить последний элемент в буфере)
DROPOLDEST (удалить самый старый элемент в буфере)
эти сценарии включаются в работу только если есть хотя бы один подписчик, который не успевает выполнять collect(). они не влияют на работу replayBuffer
1 минута
7 октября 2022