Как организовать запрос к сети каждые 5 секунд для четырёх ViewModel?

Как настроить периодическое сетевое обновление для четырёх ViewModel с интервалом в 5 секунд? Контекст: Android/MVVM, многопоточное программирование, RxJava/Coroutines Вместо отдельных таймеров для каждой VM следует…

Короткий ответ

Что ответить на собеседовании

Как настроить периодическое сетевое обновление для четырёх ViewModel с интервалом в 5 секунд? Контекст: Android/MVVM, многопоточное программирование, RxJava/Coroutines Вместо отдельных таймеров для каждой VM следует использовать единый источник данных с общей периодикой. Для запуска повторяющихся запросов подойдут Flowable.interval в RxJava либо связка flow + delay в Coroutines. Подписку лучше разместить в репозитории, результаты кэшировать, а затем передавать через LiveData/StateFlow. Все ViewModel получают данные из одного стрима, благодаря чему сокращаются нагрузка на сеть и количество одинаковых запросов. Необходимо обрабатывать ошибки…

Подробный разбор

Ответ с пояснениями

Как настроить периодическое сетевое обновление для четырёх ViewModel с интервалом в 5 секунд?

  • Контекст: Android/MVVM, многопоточное программирование, RxJava/Coroutines
  • Вместо отдельных таймеров для каждой VM следует использовать единый источник данных с общей периодикой.
  • Для запуска повторяющихся запросов подойдут Flowable.interval в RxJava либо связка flow + delay в Coroutines.
  • Подписку лучше разместить в репозитории, результаты кэшировать, а затем передавать через LiveData/StateFlow.
  • Все ViewModel получают данные из одного стрима, благодаря чему сокращаются нагрузка на сеть и количество одинаковых запросов.
  • Необходимо обрабатывать ошибки и отменять подписку при уничтожении ViewModel, то есть учитывать жизненный цикл.
  • Этот вариант повышает производительность приложения и делает тестирование проще.

Детали:

  1. В репозитории создаётся периодический поток, например RxJava Flowable.interval(5s), который запускает сетевой запрос каждые 5 секунд.
  2. Все запросы выполняются централизованно в репозитории, а полученные данные сохраняются в BehaviorSubject или StateFlow.
  3. Каждая ViewModel подключается к этому потоку и получает его актуальное состояние.
  4. Когда VM прекращает работу, её подписка отменяется, поэтому утечки памяти не возникают.
  5. В варианте с Coroutines для запуска периодической задачи можно использовать while(isActive) { delay(5000); запрос; }.

Резюме: оптимальным и масштабируемым решением будет центральный таймер с единой подпиской и получение данных ViewModel из общего потока.

Подробный ответ

Основной ответ

Чтобы обновлять данные с сервера каждые 5 секунд для четырёх ViewModel, рационально организовать один общий источник данных с единым таймером и реактивным потоком — например, на RxJava или Kotlin Flow. Все ViewModel подписываются на этот поток и получают новые значения. Так устраняется дублирование сетевых обращений и повышается эффективность приложения.

Ключевые моменты

  • Единый таймер: создаётся один Flow/Observable с интервалом в 5 секунд; он выполняет сетевой запрос и публикует полученный результат.
  • Общий кэш/репозиторий: сетевое взаимодействие сосредоточено в репозитории, который кэширует ответы. Благодаря этому все ViewModel получают согласованные актуальные данные, а число сетевых вызовов уменьшается.
  • Подписки во ViewModel: каждая ViewModel подключается к потоку репозитория и принимает новые данные сразу после их поступления.
  • Обработка ошибок: для устойчивой работы следует предусмотреть retry, backoff и состояние загрузки.
  • Жизненный цикл: нужно своевременно выполнять отписку (dispose, cancel), чтобы не допустить утечек памяти.

Практический контекст

В Android-разработке, например, применяют Kotlin Coroutines с Flow и функцию flow { while (isActive) { emit(request()); delay(5000) } }, которую репозиторий предоставляет вьюмоделям. В результате запрос выполняется один раз, а его данные передаются сразу четырём ViewModel, что помогает сохранить производительность и консистентность данных.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку