Как обрабатывать запущенную AsyncTask во время изменения ориентации/конфигурации?

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

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

У меня есть AsyncTask, в котором я постоянно обновляю текст TextView. Выполнение задачи запускается нажатием кнопки-переключателя. Первоначально у меня был AsyncTask в качестве внутреннего класса для основного действия. Но позже я изменил его на внешний класс.

Я использую методы onSaveInstanceState() и onRestoreInstanceState() для хранения и восстановления значения textview во время изменения ориентации. Чего я не могу добиться, так это после ориентации, как мне восстановить состояние кнопки, а также возобновить AsyncTask?


person Abhishek    schedule 02.05.2013    source источник


Ответы (3)


Согласно этой странице: http://developer.android.com/guide/topics/manifest/activity-element.html#config, если ваше приложение нацелено на уровень API 13 или выше, вы должны использовать android:configChanges="orientation|screenSize", чтобы перехватить поворот экрана в метод onConfigurationChanged().

При этом методы onPause и onResume не вызываются, поэтому ваш TextView сохранит свое значение. И, на мой взгляд, это не остановит выполнение AsyncTask. Если да, попробуйте вспомнить его в методе onConfigurationChanged.

person grattmandu03    schedule 02.05.2013

  1. Используйте класс Application, он всегда доступен, и храните там задачу в статической переменной.

  2. Добавьте фиктивный фрагмент в активность с setRetainInstance(true), используйте его для хранения и запуска AsyncTasks. Он автоматически прикрепится при ротации, и Activity сможет снова найти его по тегу.

  3. Используйте службу для запуска фоновых вещей, фоновые службы не зависят от перезапуска ротации, активность может снова привязываться к ней.

person S.D.    schedule 02.05.2013
comment
Плохая идея - вводить статические экземпляры, в которых участвует Context. Он склонен к утечкам памяти. - person waqaslam; 02.05.2013
comment
@Вакас Нет. Класс приложения уже фактически является синглтоном, он уничтожается последним. - person S.D.; 02.05.2013
comment
что, если на контекст вашей активности ссылается статическая AsyncTask? - person waqaslam; 02.05.2013

Почему вы не можете просто сохранить состояние кнопки в пакете в onSaveInstanceState(...) и восстановить его во время onCreate(...) и, следовательно, возобновить выполнение AsyncTask в зависимости от состояния кнопки? Обратите внимание: по моему опыту, после изменения ориентации обычно вызывается onCreate(..), а не onRestoreInstanceState().

person Stochastically    schedule 02.05.2013