Как реализовать связь Activity-Service

У меня есть следующая ситуация:

У меня есть Служба, которая периодически проверяет новые данные через Интернет,

  • Когда новые данные доступны, они загружаются и сохраняются в sqlite.
  • Когда сохранение в db завершено, служба передает намерение так, чтобы активность знала, чтобы вытащить новые данные из db.

Пользователь может запросить немедленное обновление …

… в этом случае я использую Messenger для запроса Службы для поиска новых данных

Вот проблема:

Пользователь уведомляется о том, что запрос продолжается, но может потребоваться некоторое время, может быть неудачным, никогда не сможет вернуться …

В настоящее время я получаю сообщение (используя Messenger) обратно из Сервиса в Информационное сообщение о результатах запроса или, если я не получаю сообщение, через х секунд информирую пользователя о том, что запрос не увенчался успехом.

  1. Можете ли вы предложить другой подход?
  2. Мне не нравится ждать сообщения, и если после x секунд никто не получит информацию, сообщите пользователю, есть ли лучший способ?

У вас есть основы, поэтому больше нечего рекомендовать. Я просто покажу вам несколько альтернатив:

  • Вы можете использовать ContentObserver и обновлять интерфейс после появления новых данных в базе данных (нет необходимости ждать сообщения от службы).
  • Если у вас много связи между компонентами Service <-> UI, вам может быть проще, если взглянуть на Otto , EventBus или просто перестроить свой код вокруг Observables / RxJava .
  • Вы можете переместить логику Timeout в службу (это будет проще, так как вся обработка ошибок будет в одном месте) и просто верните сообщение об ошибке в пользовательский интерфейс. Большинство сетевых фреймворков позволяют вам установить параметр тайм-аута соединения и выполнить запрос по истечении этого времени. Если вы еще не просмотрели сетевые фреймворки – отличная отправная точка – Retrofit + OkHttp .

Вы можете рассмотреть оптимистичные рендеринговые / оптимистичные обновления – шаблон, в котором вы обновляете пользовательский интерфейс на клиенте, как будто он успешно работает на сервере. Как только вы получите ответ от сервера, вы соответствующим образом обновите пользовательский интерфейс. Вы можете отсылать приложения с новыми проектами, такими как goouts.

Для получения дополнительной информации см. Следующие обсуждения:

Я предполагаю, что использование этого подхода даст лучшее удобство для вашего приложения.

Текущая реализация выглядит нормально. Однако вы можете улучшить его, следуя этому разговору: https://www.youtube.com/watch?v=BlkJzgjzL0c

Если вы думаете об этом как о проблеме диспетчера модели, проблема здесь заключается в отсутствии модели для представления состояния службы. Когда Служба выполняет обновление, это «состояние» необходимо отразить в пользовательском интерфейсе. Таким образом, службе необходимо записать это где-нибудь, к которому может обратиться пользовательский интерфейс.

Один из вариантов – это просто кусок общей памяти, такой как объект Singleton или даже статическая переменная-член (не рекомендуется). Другой вариант – сохранить это состояние в своей базе данных.

Другая проблема заключается в уведомлении пользовательского интерфейса, когда это состояние изменяется. Как упоминалось в других сообщениях, существует несколько способов сделать это, например, LocalBroadcast, шину сообщений, такую ​​как Otto, ContentObservers и т. Д.