Неправильно ли частично применять шаблон (компоненты архитектуры Android MVVM) при создании приложения?

У меня есть большое приложение, в котором есть:

  • некоторые фрагменты, которые должны отображать данные в реальном времени, полученные через Bluetooth (с использованием службы переднего плана, чтобы поддерживать соединение с устройством работоспособности).
  • некоторые фрагменты, которые показывают сохраненные данные - может потребоваться доступ к репо (и, таким образом, использование шаблона архитектурного компонента MVVM нормально, более того, даже рекомендуется).

Мой вопрос простой:

Правильно ли (с архитектурной точки зрения / дизайна приложения) не использовать поток: View-ViewModel-Repo-DB / Cloud доступ для всего приложения? - применение шаблона Android только для тех фрагментов / действий, которые действительно показывают сохраненные данные.

Я спрашиваю об этом, если отображение данных в реальном времени (не хранящихся в постоянном хранилище, а транслируемых службой) не складывается по шаблону MVVM: (Репо чего? У меня нет 2-3-4-5 источники данных для управления ими; ViewModel чего?) Я могу просто иметь несколько объектов LiveData - в классе Singleton - обновляемых Сервисом / или Сервис может отправлять широковещательные сообщения в реальном времени (так что Действия просто привязываются к Сервису или наблюдая за некоторыми объектами LiveData из класса Singleton), не имеет значения).

Идея этой проблемы заключается в том, что служба переднего плана является источником данных, но не постоянных данных. Если применить дизайн MVVM Android для всего приложения, возникает дополнительный вопрос:

  • где находится служба переднего плана на этой диаграмме? Это компонент приложения, поэтому он должен находиться на одном уровне с Activity / Fragment. С другой стороны, это источник данных. (и, следовательно, он должен быть помещен в Репозиторий).

Кроме того, у меня есть SharedPref, используемый пользовательским интерфейсом и службой, например:

  1. ALERT_HEART_RATE - Сервис предупреждает пользователя, когда полученное значение ›= ALERT_HEART_RATE; - Активность показывает это значение / предлагает возможность изменить это значение.

Спасибо.


comment
Возможно, у меня нет точного ответа на ваш вопрос, поскольку ваш вопрос кажется мне тривиальным, хотя я могу точно сказать, что даже для вашего шаблона службы переднего плана вы все равно можете следовать шаблону MVVM, где ваша служба теперь обновляет репо, а не пользовательский интерфейс напрямую & ваш пользовательский интерфейс теперь запрашивает данные в режиме реального времени через viewmodel-repo. Проверьте мой ответ: stackoverflow.com/a/53552240/10271334   -  person Jeel Vankhede    schedule 12.11.2020


Ответы (1)


Неважно, является ли источник данных постоянным или нет ... единственная разница с динамическими данными состоит в том, что двусторонняя привязка данных не имеет смысла, потому что источник данных доступен только для чтения.

person Martin Zeitler    schedule 06.11.2020
comment
Спасибо за ответ. Проблема более сложная: служба также имеет доступ к некоторым переменным SharedPref, которые также отображаются в пользовательском интерфейсе. Таким образом, логика всего приложения в основном находится внутри службы переднего плана. Например, мне нужно сохранить ALERT_HEART_RATE, который используется как службой, так и пользовательским интерфейсом (Служба использует его, чтобы предупредить пользователя (когда полученное значение больше, чем ALERT_HEART_RATE, Activity показывает значение, которое должно быть синхронно со значением, используемым Сервисом). Я обновлю свой вопрос, может быть. - person Andrei; 07.11.2020
comment
Используйте DataStore вместо SharedPreferences для новых приложений ... и, в принципе, это не сильно отличается от веб-службы R / O. И хотя служба переднего плана не затрагивает представления, у нее может быть своя собственная логика. ViewModel скорее для управления обзором. - person Martin Zeitler; 07.11.2020
comment
Ага, ты прав. У Сервиса своя логика - моя проблема - лучший способ связать Сервис с пользовательским интерфейсом, если есть много факторов (например, DataStore / SharedPref). Итак, вы рекомендуете придерживаться шаблона MVVM (имея репо, имеющее доступ к службе переднего плана)? - person Andrei; 07.11.2020
comment
Служба может транслировать значения измерений в приложение ... и нет правильного или неправильного, пока служба не пытается получить доступ к представлениям из-за разделения обязанностей. Что-то похожее: ServiceBroadcastLiveDataViewModelView. - person Martin Zeitler; 07.11.2020
comment
То, что вы сказали, означает использование приемника в ViewModel (для обновления LiveData) и оставление репозитория снаружи (без репо). И здесь возникает вопрос: две части одного и того же приложения имеют 2 «архитектурных шаблона»: 1. Указанный вами во фрагментах / действиях «в реальном времени» и 2. Шаблон MVVM Android в тех фрагментах, к которым осуществляется доступ. Данные БД. Это нормально? (не применяется один и тот же шаблон в приложении) - person Andrei; 08.11.2020