Android сохраняет данные об активности во время поворота экрана

Много гуглю, но сейчас решил спросить..

Моя деятельность делает только одну простую вещь - загружает изображение из Интернета с помощью AsyncTask.

Но есть много проблем, которые я не знаю, как решить.

1.] Пользователь поворачивает экран после того, как AsyncTask загрузил изображение. Как мне справиться с этим поворотом экрана? Где временно сохранить изображение, чтобы оно было доступно после воссоздания активности?

Я не хочу блокировать ориентацию экрана (android:screenOrientation="landscape") или управлять ею самостоятельно (android:configChanges="orientation").

Я просто хочу сохранить картинку куда-нибудь..

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

2.] Пользователь поворачивает экран во время загрузки изображения AsyncTask.

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

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

Или AsyncTask плохой выбор для загрузки изображения? Должен ли я использовать что-то еще? Услуга?

Итак.. Как решить эти проблемы? Я уверен, что многим разработчикам приложений тоже приходится решать эту проблему. Но для меня это все по-гречески :(


person Vojtěch Bartoš    schedule 09.07.2012    source источник
comment
Этот метод устарел. Вместо этого используйте новый API фрагментов setRetainInstance(boolean); Может быть, попробовать взглянуть на Frament API? developer.android.com/reference/android/app/Fragment.html   -  person javajavajava    schedule 10.07.2012
comment
@user1454749 user1454749 А как насчет старых версий Android? множество из нас все еще используют Android 2.x   -  person Izkata    schedule 10.07.2012
comment
Да, я это заметил конечно.. Но всегда лучше посмотреть решение на примере.. особенно если ты новичок...   -  person Vojtěch Bartoš    schedule 10.07.2012
comment
@Izkata для Android 2.x есть библиотека совместимости.. :)   -  person Vojtěch Bartoš    schedule 10.07.2012


Ответы (2)


Когда ваша AsyncTask завершит загрузку изображения, сохраните его в каталоге кеша вашего приложения. Сохраните путь к сохраненному изображению в свойстве класса Activity. Затем вы можете переопределить метод onSaveInstanceState вашей активности, чтобы передать путь кэшированного изображения самому себе во время изменения ориентации. В вашем методе onCreate проверьте пакет savedInstanceState на наличие сохраненного пути к изображению. Если этот путь существует, не пытайтесь повторно загрузить образ. Вместо этого просто загрузите образ с диска.

person twaddington    schedule 09.07.2012