#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. Я не могу разделить точки зрения, но они принадлежат вам обоим.