Прогресс загрузки доходит до подписчика не полностью
Загрузка файла быстро обновляет прогресс в состоянии:
private val _progress = MutableStateFlow(0)
val progress: StateFlow<Int> = _progress
// в цикле загрузки, много раз подряд
_progress.value = percent
Подписчик на экране логирует каждое полученное значение и обнаруживает, что многие проценты пропущены: 0, 7, 23, 61, 100. Почему так?
- Значения теряются из-за потока выполнения: если собирать их на отдельном диспетчере, подписчик получит все проценты подряд
- Поток состояния хранит только последнее значение: если подписчик не успевает за обновлениями, промежуточные схлопываются
- Так ведут себя только наблюдаемые данные экрана, а поток состояния гарантирует доставку каждого отправленного значения
- Значения теряются потому, что подписка оформлена позже старта загрузки: история отправленных значений не сохраняется вообще
