Что мне использовать для восстановления состояния моей активности после ее воссоздания?

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

В моем случае, например, моя активность использует AsyncTask для отображения ProgressBar при получении данных с сервера. Но если пользователь просто поворачивает экран, действие перезапускается и повторяет запрос на сервер.

Если поворот экрана выполняется, когда AsyncTask все еще находится в doInBackground(), ожидая ответа сервера, я получаю ошибку android.view.WindowLeaked.

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

onSaveInsanceState() рекомендуется? Как я могу сохранить частично полученный JSON в пакете? Или, может быть, мне следует использовать onRetainNonConfigurationInstance()...

Пошлю бутылочку бразильского напитка "кайпиринья" для доброй души, которая мне помогает...


person Lucas Jota    schedule 17.06.2012    source источник


Ответы (1)


Вам нужно использовать другую архитектуру.

Переместите фоновую операцию из AsyncTask в службу. Служба работает в фоновом режиме независимо от какой-либо активности и не перезапускается при изменении ориентации устройства.

Фоновая служба может взаимодействовать с активностью переднего плана посредством широковещательной рассылки. В сервисе вы можете отправлять трансляции с информацией о прогрессе, используя sendBroadcast(). Вы можете получать трансляции в Activity, используя BroadcastReceiver.

РЕДАКТИРОВАТЬ: Для менее радикальных подходов, которые могут подойти в зависимости от вашей ситуации, см.: http://developer.android.com/guide/topics/resources/runtime-changes.html. В частности, если вы не используете разные ресурсы для альбомной и портретной ориентации, то второй способ (самостоятельная обработка изменения конфигурации) может сработать.

EDIT2: дополнительная информация здесь: Перезапуск активности при ротации Android

person Theo    schedule 17.06.2012
comment
Спасибо, кажется, использование сервисов - хороший подход. Сейчас я работаю над другим выпуском, но буду давать вам отзывы, пока смогу. - person Lucas Jota; 25.06.2012
comment
Я попробую использовать запущенные службы, потому что они выглядят проще в реализации. Но мне не ясно, являются ли связанные услуги более подходящими или нет. - person Lucas Jota; 02.07.2012
comment
Согласен, запущенные сервисы в этой ситуации лучше. Связанные службы более сложны и имеют некоторые проблемы, такие как утечка памяти в некоторых версиях Android. - person Theo; 02.07.2012