Компоненты архитектуры Android ViewModel - связь с сервисом /IntentService

Я изучаю компоненты Google для архитектуры Android. В моем проекте я полагаюсь на Сервисы и IntentServices. Как правильно связываться с ViewModel приложения из IntentService или Service? Это достижимо с помощью LiveData?

1 ответ

Решение

TL;DR Это достижимо - используйте отношения наблюдателя. Ваш IntentService и вероятный сервис определения местоположения не должны знать о вашей ViewModel. Рассмотрите возможность использования репозитория. LiveData можно использовать (см. postValue). Это хорошо для обновления пользовательского интерфейса (ViewModel to Activity Communication), потому что он поддерживает жизненный цикл. Когда вы не обновляете пользовательский интерфейс, вы можете рассмотреть RxJava.


Это зависит от того, какую архитектуру вы используете. Если вы делаете что-то похожее на то, что описано в Руководстве по архитектуре приложения, ваш IntentService, вероятно, запускается вашим удаленным исходным кодом данных:

введите описание изображения здесь

Ваш удаленный исходный код данных будет иметь наблюдаемую (Rx Flowable, LiveData и т. Д.), Которую я назову наблюдаемой A, для данных, загружаемых вашей службой намерений. Ваш класс репозитория (если вы его используете) будет иметь наблюдаемый b, а ваш ViewModel будет иметь наблюдаемый c.

Репозиторий подписывается на наблюдаемую информацию в вашем сетевом коде (наблюдаемая A), ViewModel подписывается на наблюдаемую в вашем хранилище (наблюдаемая B), а ваша активность / фрагмент / представление подписывается на наблюдаемую в вашей ViewModel (наблюдаемая c). Затем...

  1. IntentService возвращает данные и устанавливает наблюдаемый A
  2. Это вызывает ваш репозиторий, потому что он подписан - он выполняет тот тип обработки данных, который должен делать репозиторий, например, сохранение данных в базе данных.
  3. Когда ваш репозиторий готов, он устанавливает наблюдаемый B с вновь обработанными данными.
  4. Это запускает вашу ViewModel, потому что он подписан - он выполняет тот тип обработки, который выполняют ViewModel, а именно форматирует данные так, чтобы они были готовы для просмотра, затем устанавливает наблюдаемую C...
  5. Это вызывает вашу активность / фрагмент / просмотр, который обновляет интерфейс

Это в основном длинная цепочка отношений с наблюдателями. На каждом уровне выполняется соответствующая обработка, затем устанавливается наблюдаемая, которая запускает следующий уровень с новыми данными. Это позволяет вам избежать сильной связи с вашей IntentService/Repository/ViewModel.

Ваши Сервисы не будут знать о вашей ViewModel (или Repository, если она у вас есть), они должны просто установить значение наблюдаемой. Если вы хотите пропустить наличие репозитория, вы можете сделать так, чтобы ViewModel наблюдал за вашим классом удаленного источника данных, но если вам нужно выполнить какую-либо логику, такую ​​как сохранение данных, загруженных в базу данных, вам, вероятно, понадобится репозиторий.

Две заметки о LiveData - Если вам нужно обновить LiveData при выполнении фоновой операции, используйте postValue,

LiveData учитывает жизненный цикл, что делает его особенно подходящим для наблюдения за вещами с жизненными циклами (действия / фрагменты). observe метод занимает LifecycleOwner,

Для наблюдателей, таких как B и A, в вашем коде репозитория / сети, скорее всего, не будет LifecycleOwner. Это означает либо делать что-то вроде использования observerForever или с использованием другой наблюдаемой, например, RxFlowable.