Управление фоновыми потоками Android и жизненный цикл активности - PullRequest
2 голосов
/ 27 января 2012

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

Я хочу, чтобы фоновый процесс был отменен, если приложение завершается или пользователь отменяет (однако мне все еще нужно уведомить веб-службу), и сохраняется, если действие уничтожается из-за изменения конфигурации или * 1004. * чтобы освободить память. Я понимаю, что буду использовать onRetainNonConfigurationInstance (), чтобы отсоединить свою активность от AsyncTask, сохранить ее, а затем снова присоединить в следующем действии, у меня уже есть инфраструктура для этого. Я также знаю, что в некоторых обратных вызовах жизненного цикла метод isFinishing сообщает мне, нормально ли закрывается мое приложение; и я верю, что могу также обработать отмену пользователя в обратном вызове диалога прогресса.

У меня есть два простых вопроса:

  1. Будет вызываться onRetainNonConfigurationInstance (), если моя активность убит из-за нехватки памяти? (Я знаю, что это будет, если причина изменение конфигурации.)

  2. В какой ситуации (как подчеркивается в руководстве разработчика) onStop () и onDestroy () не вызываются? (Я хочу знать, если мой код, обрабатывающий отмену, всегда будет выполняться.)

В общем, могу ли я быть уверен, что при реализации onRetainNonConfigurationInstance () и onDestroy () с проверенным isFinishing () в каждой ситуации мой фоновый поток будет обрабатываться соответствующим образом?

БОНУСНЫЙ вопрос: Если моё приложение по какой-то причине убито (скажем, навсегда), как я могу предоставить AsyncTask способ сохранить ответ в любом случае? Могу ли я сохранить в нем экземпляр общих настроек и записать в него данные?

1 Ответ

3 голосов
/ 27 января 2012

Будет ли вызываться onRetainNonConfigurationInstance (), если моя активность будет прервана из-за нехватки памяти?

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

В какой ситуации (как подчеркивается в руководстве разработчика) onStop () и onDestroy () не вызываются?

Ваш процесс может быть остановлен из-за нехватки памяти (onStop(), скорее всего, будет вызываться, но onDestroy() может не произойти, если Android спешит, например, из-за входящего телефонного звонка). Кроме того, ваше приложение может аварийно завершить работу с необработанным исключением. Я не уверен, если onDestroy() вызван, если пользователь принудительно останавливает вас, но я сомневаюсь в этом.

В общем, могу ли я быть уверен, что при реализации onRetainNonConfigurationInstance () и onDestroy () с проверенным isFinishing () в каждой ситуации мой фоновый поток будет обрабатываться соответствующим образом?

«Каждый» - это сильное слово. Если Android завершит ваш процесс, ваш поток также исчезнет.

Если мое приложение по какой-то причине (скажем, навсегда) уничтожено, как я могу предоставить AsyncTask способ сохранить ответ в любом случае?

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

...