Сервисы и ViewModels в Android MVVM - как они взаимодействуют?

Я использую ViewModel из Android Architecture в течение некоторого времени и придерживаюсь того, чтобы никогда не подвергать ViewModel контексту / представлениям (Android Framework / UI). Однако недавно я столкнулся с интересной проблемой.

При создании приложения таймера, когда таймер запускается, в фоновом режиме запускается служба, запускающая таймер. Таким образом, когда приложение закрыто, таймер по-прежнему работает на переднем плане в панели уведомлений, пока не прекратятся все таймеры. Однако это означает, что все мои объекты и состояние таймера содержатся в этой службе. Мой пользовательский интерфейс должен обновляться при каждом тике, но модель не обязательно нуждается в обновлении Как ViewModels вписывается в этот сценарий?

Должно ли Activity получать LocalBroadcasts и каждый раз уведомлять ViewModel? Следует ли считать состояние пользовательского интерфейса из Service-> Activity-> VM? Кажется, что Service - это ViewModel, но это не кажется эффективным.

Как насчет Service обновляет данные в Model, наблюдаемые ViewModel, наблюдаемые View. Тот же самый случай, если этот "Model" может быть введен, например, через Dagger.

egoldx 01.11.2018 15:25

В этом случае таймер отсчитывает каждую секунду. Каждый тик должен обновлять пользовательский интерфейс, если он доступен, но не обязательно записывать в слой модели. Уточню это в вопросе и спасибо за предложение

Josh Ribeiro 01.11.2018 15:29

~ "никогда не подвергать ViewModel контексту / представлениям". Вы имеете в виду наоборот ...

IgorGanapolsky 25.03.2020 21:17
27
3
10 369
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

После некоторой игры с различными структурами Сервис нашел свое место в MVVM. В этой ситуации меня сбивало с толку мысль о том, что службу не следует запускать из ViewModel, и тот факт, что необходимы два репозитория: база данных комнат для хранения таймеров и служба для представления состояния текущих таймеров (onTick, воспроизведение / пауза статус и т. д.). ViewModel не должен иметь никаких ссылок на представления, но с контекстом приложения все в порядке. Таким образом, запуск службы из ViewModel возможен путем расширения класса AndroidViewModel. Вот окончательная структура:

Слой модели

  • Услуга - поддерживает список активных таймеров, генерирует события onTick () EventBus, поддерживает активный статус воспроизведения / паузы таймера. Завершается при отсутствии активных таймеров.
  • База данных номеров - сохраняет таймеры для использования в будущем (имя, общее время и т. д.)

ViewModel

  • ViewModel - прослушивает события пользовательского интерфейса, выполняет бизнес-логику и отправляет сообщения EventBus. Любые изменения в модели сообщаются через ViewModel.

UI

  • Деятельность - выполняет задачи потока приложений. Прослушивает соответствующие сообщения ViewModel для обмена фрагментами / запуска новых действий и т. д.
  • Фрагмент - обрабатывает анимацию и UI. Также уведомляет ViewModel о взаимодействии с пользователем

Любой пример исходного кода даст ответ на 100%.

Chrishan 23.03.2019 02:14

Почему вы выбрали EventBus вместо RxJava или Kotlin Coroutines?

IgorGanapolsky 25.03.2020 21:21

В то время Kotlin Coroutines еще только зарождались. Сегодня Coroutines - более надежный маршрут

Josh Ribeiro 02.06.2020 18:27

Сервисы следует рассматривать как AndroidViewModel, имеющий контекст приложения в архитектуре MVVM. Потому что сервис что-то делает с данными, как ViewModels.

Службы не могут напрямую взаимодействовать с базами данных. Но он должен разговаривать с репозиториями, которые стажеры общаются с базами данных, такими как SQLite / Room / Server.

Поскольку ViewModel имеет такие представления, как Fragment / Activity. Служба трансформируется в Службу переднего плана с уведомлением в строке состояния при обновлении. Мы не используем LiveData для представления уведомлений, а обновляем само уведомление (мы можем считать это воссозданным действием / фрагментом).

Другие вопросы по теме