Возможно ли, что IntentService будет убит до того, как его использует Activity?

У меня есть приложение, в котором есть IntentService для фоновой обработки, в частности, оно извлекает данные из сети и сохраняет их в базе данных Sqlite. Мои действия используют Context.startService() для запроса службы на обновление данных, и служба отправляет локальное широковещательное сообщение, когда обновление завершено.

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

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

Теперь, если IntentService был уничтожен в середине операции, он никогда не отправит сообщение DONE, а Activity никогда не узнает, что запрос не выполнен, и не будет повторно запрашивать ресурс. Это возможно? И если это произойдет, есть ли способ сообщить Activity?


person Clyde    schedule 28.09.2012    source источник


Ответы (2)


Это возможно?

Пока вы ловите все возможные необработанные исключения, нет. Компоненты не «убиваются» по отдельности, скажем, для восстановления памяти — это делается на основе процесса за процессом.

person CommonsWare    schedule 28.09.2012
comment
Спасибо! Я не понял, что будут завершены только целые процессы. Конечно, мне нужно убедиться, что любые возможные исключения перехвачены, и я думаю, что делаю это. Если нет, то это баг и моя проблема. - person Clyde; 29.09.2012

Если вас это беспокоит, отправьте широковещательный флаг в onDestroy IntentService (или просто установите точку останова, чтобы вы могли видеть, срабатывает ли она). IntentService задуман как упрощенная служба, которая обрабатывает свой собственный жизненный цикл, поэтому, если вы передаете работу из службы в пул потоков, возможно, IntentService считает, что завершает свою работу — вы можете поймать это в onDestroy.

Очевидно, нельзя сказать, происходит ли это, не глядя на код, но этот механизм позволит вам проверить, так ли это.

person Paul D'Ambra    schedule 28.09.2012