Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Android: viewmodel, repository, flow, shared flow, periodic task

Есть четыре ViewModel, и нужно каждые 5 секунд подписываться на запрос из сети. Как это лучше организовать?

Этот вопрос проверяет умение масштабировать периодические сетевые запросы в архитектуре MVVM.

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

Лучше запускать единственный Flow или LiveData в одном ViewModel, который внутри viewModelScope с помощью flow {} и delay(5000) эмитит результат каждые пять секунд. Остальные три ViewModel могут делегировать подписку на общий источник данных (SharedFlow или отдельный синглтон-репозиторий), чтобы не создавать дубли HTTP-запросов и экономить ресурсы.

Длинный ответ

Репозиторий с Flow

  • fun getUpdates(): Flow<Data> = flow { while(true) { emit(api.fetch()); delay(5000) } }.shareIn(...)

SharedFlow / StateFlow

  • В репозитории создаётся val updates = MutableSharedFlow<Data>(replay=1), запускается периодически и инжектится во все ViewModel.

ViewModel

  • В каждом viewModelScope.launch { repository.updates.collect { ... } }

Преимущества:

  • Один запрос → четыре подписчика.

  • Лёгкая отмена при уничтожении ViewModel.

Альтернатива LiveData

  • Превратить Flow в LiveData через asLiveData().

Уровень

  • Рейтинг:

    2

  • Сложность:

    6

Навыки

  • Android

    Android

Ключевые слова

#viewmodel

#repository

#flow

#shared flow

#periodic task

Подпишись на Android Developer в телеграм