Вступить в клуб →
средняявопросКорутины и Flow

Прогресс загрузки доходит до подписчика не полностью

Загрузка файла быстро обновляет прогресс в состоянии:

private val _progress = MutableStateFlow(0)
val progress: StateFlow<Int> = _progress

// в цикле загрузки, много раз подряд
_progress.value = percent

Подписчик на экране логирует каждое полученное значение и обнаруживает, что многие проценты пропущены: 0, 7, 23, 61, 100. Почему так?

  • Значения теряются из-за потока выполнения: если собирать их на отдельном диспетчере, подписчик получит все проценты подряд
  • Поток состояния хранит только последнее значение: если подписчик не успевает за обновлениями, промежуточные схлопываются
  • Так ведут себя только наблюдаемые данные экрана, а поток состояния гарантирует доставку каждого отправленного значения
  • Значения теряются потому, что подписка оформлена позже старта загрузки: история отправленных значений не сохраняется вообще

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела