Сервисы и ViewModels в Android MVVM - Как они взаимодействуют? - PullRequest
0 голосов
/ 01 ноября 2018

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

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

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

1 Ответ

0 голосов
/ 06 ноября 2018

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

Слой модели

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

ViewModel

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

UI

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