Обработка изменений ориентации экрана при выполнении AsyncTasks - PullRequest
20 голосов
/ 03 января 2011

Меня это некоторое время беспокоило. Как правильно обрабатывать изменения ориентации экрана, когда у меня работает отдельный Thread / AsyncTask? В настоящее время у меня есть

android:configChanges="orientation|keyboard|keyboardHidden"

по моему AndroidManifest.xml, но это не очень поощряется :

Примечание: Следует избегать использования этого атрибута и использовать его только в качестве крайней меры. Пожалуйста, прочитайте Обработка изменений времени выполнения для получения дополнительной информации о том, как правильно обрабатывать перезапуск из-за изменения конфигурации.

Кроме того, в эмуляторе 2.3 он работает при переключении на landscape, но переключение обратно на portrait не удается.

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

Есть ли другой способ сделать это, или есть способ исправить 2.3, чтобы переключиться обратно в портрет?

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

Ответы [ 3 ]

7 голосов
/ 03 января 2011

У меня была проблема, похожая на вашу, и я обошел ее, реализовав AsyncTask как часть класса, который наследуется от класса Application.* * * * * * * * * * * * * * * * * * * * * * * * Класс Application доступен в течение всего времени жизни приложения. Поэтому вам не нужно беспокоиться о том, что ваш AsyncTask будет прерван, если не будет уничтожено все приложение.

Чтобы получать уведомления, когда задача имеетЗакончив, Activity должен реализовать интерфейс, который он использует для регистрации в классе Application.

Когда ваше приложение уничтожено из-за поворота экрана, вы можете отменить регистрацию вашего Activity в классе Application и перерегистрировать его при повторном создании.Если задание заканчивается между уничтожением и восстановлением, результат операции может быть сохранен в классе Application, поэтому Activity может проверить, выполняется ли еще задание или уже доступен ли результат при воссоздании.

Другое преимущество заключается в том, что у вас есть прямой доступ к контексту приложений, поскольку класс Application является подклассом класса Context.

2 голосов
/ 03 января 2011

Взгляните на библиотеку droid-fu BetterAsyncTask. Он предназначен для обработки именно этого случая.

http://brainflush.wordpress.com/2009/11/16/introducing-droid-fu-for-android-betteractivity-betterservice-and-betterasynctask/

0 голосов
/ 03 января 2011

Я уже выскочил аналогичный вопрос здесь .

В основном есть пример того, как приостановить / возобновить AsynTask при вращении устройства. Однако он по-прежнему не подходит для всех случаев (иногда невозможно безопасно приостановить действие, например создание нового пользователя на удаленном сервере). Для этих «небезопасных» случаев вам нужно несколько кодировать, я бы назвал хитрый «фреймворк». Вы увидите, что CommonsWare дает ссылки на github.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...