2013-06-16 4 views
0

В моей деятельности у меня есть асинтаза, которая загружает серию изображений ... (это может занять некоторое время в зависимости от размера изображений) ... до того, как я запустил asynctask, я покажу диалог прогресса в onPreExecute и уведомление (когда пользователь нажимает на уведомление, он перенаправляется на мою активность с диалоговым окном выполнения). когда моя asynctask завершается, в onPostExecute, я удаляю диалог и уведомление. Я обрабатываю ориентацию экрана, используя onRetainNonConfigurationInstance, чтобы сохранить мою асинтезу, чтобы при повороте экрана я проверял, все ли запущена задача, и я показываю диалог выполнения, если он все еще работает в onCreateпредотвратить уничтожение aynctask до завершения?

Проблема: иногда: моя асинтаза загружает только 1 файл, и кажется, что он убит ... (без исключения в logcat) ... в результате моя заметка всегда есть и мой прогресс диалог также ... и они остаются там до бесконечности ....

я попробовал решение Джеффа Аксельрода там: How can I ensure an AsyncTask is completed before my activity is killed?:

It looks like if I override the onPause() event in my activity, and from within the overridden onPause(), I call cancel(false) on the AsyncTasks, then the activity is not destroyed until the AsyncTasks are completed. 

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

ждет ваших решений, ребята! я читаю использование asyntask только для короткой задачи; будет ли использование потока и обработчика решает мою проблему? будет андроид убивает мою деятельность или поток, если последний не закончен ???

ответ

2

Лучший способ обработки Asynctask - described in this article.

Вкратце, идея состоит в том, чтобы сохранить AsyncTask в фрагменте с помощью setRetainInstance(true);, это позволит вам оставаться в активном состоянии AsyncTask в течение всего времени, в течение которого пользователь сохраняет этот фрагмент и не будет уничтожен при изменении конфигурации (изменение ориентации).

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

+0

thx для этого хорошего руководства, но это все еще не объясняет, почему моя aynctask никогда не завершается, если я не поместил 'cancel (true);' в мое событие активности onPause – yeahman

+0

Затем опубликуйте свой код, чтобы мы могли его изучить. Мой плохой я не указал его прямо, но вы не должны использовать 'onRetainNonConfigurationInstance' и вместо этого использовать описанный метод. – Gustek