Я использую ViewModel из Android Architecture в течение некоторого времени и придерживаюсь того, чтобы никогда не подвергать ViewModel контексту / представлениям (Android Framework / UI). Однако недавно я столкнулся с интересной проблемой.
При создании приложения таймера, когда таймер запускается, в фоновом режиме запускается служба, запускающая таймер. Таким образом, когда приложение закрыто, таймер по-прежнему работает на переднем плане в панели уведомлений, пока не прекратятся все таймеры. Однако это означает, что все мои объекты и состояние таймера содержатся в этой службе. Мой пользовательский интерфейс должен обновляться при каждом тике, но модель не обязательно нуждается в обновлении Как ViewModels вписывается в этот сценарий?
Должно ли Activity получать LocalBroadcasts и каждый раз уведомлять ViewModel? Следует ли считать состояние пользовательского интерфейса из Service-> Activity-> VM? Кажется, что Service - это ViewModel, но это не кажется эффективным.
В этом случае таймер отсчитывает каждую секунду. Каждый тик должен обновлять пользовательский интерфейс, если он доступен, но не обязательно записывать в слой модели. Уточню это в вопросе и спасибо за предложение
~ "никогда не подвергать ViewModel контексту / представлениям". Вы имеете в виду наоборот ...
После некоторой игры с различными структурами Сервис нашел свое место в MVVM. В этой ситуации меня сбивало с толку мысль о том, что службу не следует запускать из ViewModel, и тот факт, что необходимы два репозитория: база данных комнат для хранения таймеров и служба для представления состояния текущих таймеров (onTick, воспроизведение / пауза статус и т. д.). ViewModel не должен иметь никаких ссылок на представления, но с контекстом приложения все в порядке. Таким образом, запуск службы из ViewModel возможен путем расширения класса AndroidViewModel. Вот окончательная структура:
Слой модели
ViewModel
UI
Любой пример исходного кода даст ответ на 100%.
Почему вы выбрали EventBus вместо RxJava или Kotlin Coroutines?
В то время Kotlin Coroutines еще только зарождались. Сегодня Coroutines - более надежный маршрут
Сервисы следует рассматривать как AndroidViewModel, имеющий контекст приложения в архитектуре MVVM. Потому что сервис что-то делает с данными, как ViewModels.
Службы не могут напрямую взаимодействовать с базами данных. Но он должен разговаривать с репозиториями, которые стажеры общаются с базами данных, такими как SQLite / Room / Server.
Поскольку ViewModel имеет такие представления, как Fragment / Activity. Служба трансформируется в Службу переднего плана с уведомлением в строке состояния при обновлении. Мы не используем LiveData для представления уведомлений, а обновляем само уведомление (мы можем считать это воссозданным действием / фрагментом).
Как насчет
Serviceобновляет данные вModel, наблюдаемыеViewModel, наблюдаемыеView. Тот же самый случай, если этот"Model"может быть введен, например, черезDagger.