Связь между виджетом, сервисом и моделью (одноэлементной) приложения (архитектура, подобная MVC)

#java #android #design-patterns #service #widget

#java #Android #шаблоны проектирования #Обслуживание #виджет

Вопрос:

У меня возник сложный вопрос, касающийся множества различных компонентов приложения. Я надеюсь, что это достаточно ясно.

В моем приложении объект приложения, синглтон, предоставляет модель (тоже синглтон) для многих действий. Основное действие представляет пользователю список временных данных. Эти данные поступают из модели.

У меня также есть виджет, и я хочу, чтобы он: — обновлялся при обновлении временных данных изнутри модели (через графический интерфейс) — по прошествии времени обновляйте, чтобы отображать только 2 первых временных данных из списка, удаляя те, которые сейчас устарели.

Для достижения второй цели я разработал сервис, который запрашивает у модели получение некоторых данных и использует таймеры для пробуждения после истечения срока действия первых данных и удаления их из списка, затем отправляет виджету широковещательную рассылку с некоторыми данными в intent, которые виджет будет отображать.

Это работает нормально.

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

Но, и вот в чем моя проблема:

как модель может сообщить виджету об обновлении? Все готово для того, чтобы сервис обновил виджет, но движок не может знать, существует ли виджет. Я не хочу, чтобы модель вызывала сервис, поскольку, возможно, виджета нет и нет необходимости в дополнительном процессе для сервиса.

Как можно элегантно переработать это взаимодействие?

Я действительно чего-то здесь не понимаю.

Ответ №1:

Вы можете использовать шаблон Observer, чтобы движок запускал события для любых компонентов приложения, которые вас интересуют, всякий раз, когда что-то обновляется, без того, чтобы компонент, создающий событие, имел какие-либо реальные знания о потребителях событий.

Объект Event, отправляемый в качестве параметра, должен содержать всю соответствующую информацию о событии, чтобы виджет пользовательского интерфейса мог обновляться и т.д., Так что нужно передавать только этот абстрактный объект «event» — и ваши слои не перетекают друг в друга.

Комментарии:

1. Я привык к шаблону observer и использую его для обновления своего графического интерфейса при изменении местоположения или временных данных. Но здесь вы имеете в виду, что сервис может быть слушателем и регистрироваться в модели по мере ее создания? Мне кажется странным, разве сервис не выполняется в своем собственном процессе (и поэтому у него будет своя модель, а не та, которая используется actvities ?)

2. извините, не очень знаком с архитектурой приложений Android — не понимал, что эти вещи выполняются в разных процессах

3. @Snicolas Из Документации Note that services, like other application objects, run in the main thread of their hosting process По умолчанию они не только находятся в одном процессе, но и являются одним потоком. Очевидно, что это можно изменить, и IntentService фактически создается отдельный поток для выполнения работы.

4. Спасибо вам обоим @smith324 и @matt b. Это работает как шарм, действительно потрясающе, мой виджет обновляется службой, вызывающей себя с течением времени, и обновляется через observable-observer, прослушивая изменения GUI-> controler-> model. Я не могу разделить точки зрения, но они принадлежат вам обоим.