2012-01-27 4 views
2

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

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

Я два простых вопроса:

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

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

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

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

ответ

3

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

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

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

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

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

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

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

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

+0

Thaks, я надеялся, что вы ответите! Поэтому у меня нет шансов сделать еще один вызов веб-сервиса isCancelled(), когда мой процесс завершается из-за низкой памяти, и я могу только надеяться, что у меня будет достаточно времени для записи данных (все же я могу использовать общие настройки для этого или он также уничтожается и поэтому не рекомендуется?). Я думаю, что я могу отменить фоновый поток до вызова завершения, а onReatinNonConfigurationInstance() достаточно для обработки изменений конфигурации. – Vincent

+0

@ Vincent: «Могу ли я использовать общие настройки для этого или он также уничтожается и, следовательно, не рекомендуется?» - значения в 'SharedPreferences' не уничтожаются до тех пор, пока приложение не будет удалено. Говоря об этом, 'SharedPreferences' являются только инкрементально лучше, чем использование какого-либо другого файла. Если вы используете базу данных для других вещей, я бы подумал о сохранении вашей информации, просто потому, что она транзакционная. – CommonsWare

+0

Я не имел в виду хранилище, но объект, который я должен использовать, чтобы написать его. Насколько я могу предположить, он связан с текущим приложением. Я пока не использую базу данных, так как хранится только очень небольшое количество временных данных. Тем не менее, я рассмотрю идею, трансактальность звучит неплохо. Спасибо за ответ! – Vincent

Смежные вопросы