LINUX.ORG.RU

Восстановить прогресбары при перегрузке Activity

 


0

2

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

Внезапно во время работы AsyncTask'а пользователь переворачивает девайс и, соответственно, Activity пересоздается. AsyncTask продолжает работать, а вот прогрессбаров уже нету. Как обойти? Знаю, что для 3.0 есть некие Loaders, но решение нужно универсальное. Или таки вручную расставлять какие-то флаги в стиле «AsyncTask работает» и проверять в Activity.onCreate()?

★★★

придётся заново инициализировать это всё в onCreate и прикручивать к работающему asyncTaskу. Во всяком случае для ранних версий фреймворков (до 9) я других способов не знаю. Новые ещё ковырять не приходилось, может там как-нибудь решили эту проблему.

koirn
()

Возможно уже не актуально, но расскажу как делал я.

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

Поэтому в манифесте, в объявлении твоего активити добавляешь такую вещь

android:configChanges="orientation"

Вот так выглядит полностью

 <activity android:name="com.kelecorix.delivery.ext.UpdateRetails"
			 android:screenOrientation ="landscape"
                         android:configChanges = "orientation|keyboardHiddent"> </activity>

Фишка в том, что система пересоздает активити, когда происходит изменение в конфигурации, а вышеуказанный код не дает этого сделать. Вместо этого вызывается onConfigurationChanged(Configuration), который ты конечно же тоже можешь обработать.

Подробнее тут и тут

P.S: Я так делаю уже года 2, с версии 1.6 еще.

Sigrlami
()
Ответ на: комментарий от Sigrlami

Спасибо за совет. Я уже натыкался на такое решение, но всё же меня смущает предостережение по ссылке не делать так слишком часто (да и другие люди мне тоже такое говорили). Плюс ко всему решение получается не слишком общим, так например если пользователь свернет приложение и развернет его обратно, Активити ведь точно пересоздастся? Или в таком случае тупо выносить загрузку в сервис?

В любом случае, благодарю.

unlog1c ★★★
() автор топика
Ответ на: комментарий от unlog1c

не делать так слишком часто

Первый раз я увидел такое решение в приложении Settings входящим в андроим поставку, в котором, почти каждое второе активити, где выполняются такие действия


<activity android:name=".vpn.VpnSettings"
                android:label="@string/vpn_settings_title"
                android:configChanges="orientation|keyboardHidden"
                android:clearTaskOnLaunch="true">
..
<activity android:name=".vpn.VpnTypeSelection"
                android:configChanges="orientation|keyboardHidden">
</activity>
..

 <activity android:name="SecuritySettings"
                android:label="@string/location_security_settings_title"
                android:configChanges="orientation|keyboardHidden"
                android:clearTaskOnLaunch="true"
                >

и так далее, если Google позволяет себе так делать, то почему мы не можем?

например если пользователь свернет приложение и развернет его обратно, Активити ведь точно пересоздастся?

Нет, оно вытянет из бекстека последний сохраненный экран и запустит OnRestart(), вот тут вроде хорошо очень описан жизненный цикл. Если я не ошибаюсь AsyncTask будет работать пока не получит finish() от сновного UI потока. Если посмотришь его описание, то его используют для коротких обновлений. AsynkTask

AsyncTasks should ideally be used for short operations (a few seconds at the most.)
Конечно, если оно будет длится более 15 секунд пользователь его обязательно свернет, т.к надоест.

В данном случае действительно лучший вариант, делать крупные обновления в фоне, в виде сервиса, Зачем пользователю смотреть на крутилку больше 30 сек?

Sigrlami
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.