2012-05-10 6 views
1

У нас есть сетевое клиентское приложение, и мы пытаемся проверить наш подход к обработке ответов с сервера в сочетании с вращением устройства. по сути, мы делаем это,Отсутствует трансляция, когда устройство повернуто?

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

наших (воспринимаемой) проблемой является то, что когда устройство вращается, активность уничтожается/воссоздается. в течение времени между тем, когда приемник активности не зарегистрирован в onPause(), и когда он перерегистрирован в onResume(), мы, возможно, пропустили намерение, которое транслируется службой.

Это настоящая проблема?

если да, то мы предположили следующее решение,

  1. первый, не использовать намерения для связи между деятельностью и обслуживанием
  2. создать две блокировки очереди: сетевые запросы и ответы в говорят, что класс приложения
  3. служба начинается поток, который take() «ы из очереди запросов
  4. активность начинает поток, который take()» ы из очереди ответа
  5. деятельности offer() «s в очередь запросов, когда он хочет, чтобы начать сетевую операцию
  6. службы offer()» S в очередь ответов, когда пост является результат работы сети

любых советы ценятся, спасибо.

ответ

0

Да, это может произойти в редких случаях, но это точно произойдет, если пользователь получит звонок. Снова ваша деятельность будет приостановлена, а затем возобновлена. Если пользователь долго говорит, ваша деятельность потеряет кучу передач из службы.

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

Ваше мнение звучит неплохо, но может скрыть сложную реализацию. Если бы я был в вашем положении, я бы подумал использовать встроенный механизм обслуживания Bound Services. Я пока не использовал его, но, похоже, он покрывает ваши потребности.

EDIT

Так на основе концепции, связанные услуг я предлагаю следующий поток:

  1. активности начинается, так называемое, липкое обслуживание.
  2. Служба регистрирует приемник для сетевых ответчиков.
  3. Служба поддерживает объект Ibinder с необходимой информацией, основанной на сетевых ответах.
  4. Активность ограничивается службой всякий раз, когда захочет, и получает объект Ibinder с информацией и выполняет необходимые действия.
  5. Когда пришло время для завершения приложения, Activity прекращает обслуживание и завершает работу.

Надеется, что это помогает ...

+0

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

+0

Идея связанных служб заключается в том, что другой компонент (активность) в вашем приложении может подключаться к нему в любое время и получать любую информацию. Ответственность за обслуживание и предоставление этой информации несет ответственность за любой компонент, который ее ограничивает. Это почти та же концепция, которую вы планируете реализовать, с той разницей, что для этой цели является встроенным механизмом andoid. Я отредактировал свой ответ, чтобы проиллюстрировать этот подход. – Christos

+0

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