2013-10-24 2 views
0

У меня есть следующая проблема. В моем приложении я загружаю данные в AsyncTask. Проблема заключается в том, что пользователь теперь щелкает по значку, чтобы открыть навигационный ящик, и открывает еще один фрагмент, из которого происходит сбой приложения. Когда AsyncTask завершена, приложение не сбой. Проблема, с которой приходится сталкиваться, заключается в том, что при переключении фрагмента (фрагменты всегда одни и те же, только с другим содержимым, зависящим от элемента NavigationDrawer), приложение сбой.Приложение вылетает, когда пользователь меняет фрагмент во время AsyncTask

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

Итак, каким будет мой подход к этому? Использовать для каждого другого вида другой фрагмент? Я думал, что использовать один и тот же фрагмент каждый раз намного проще, поскольку он просто отображает разные данные, но структура, макет и т. Д. - все равно. Просто данные, которые он получает, различны.

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

Как вы к этому подходите? Используйте разные фрагменты для каждого другого дисплея? Или как? Блокировать как-нибудь? Если пользователь нажимает на элемент навигационного ящика, асинхронность должна остановить все его действия (если некоторые из них выполнены), а затем перезапустить выполнение всех действий. Есть ли способ сделать это?

Пожалуйста, обратите внимание, что фрагмент, где выполняются асинхронным и деятельность, где фрагменты называется в двух разных файлах

ответ

1

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

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

+0

Ваша догадка правильная. Извините, я не могу показать код. Но я не думаю, что это было бы полезно, поскольку это просто когда назначено представление. Больше ничего. Поэтому я бы попытался отменить асинтаску? Как мне это сделать? Просто 'asynctask.cancel (true)'? – Musterknabe

+0

Да, но проверьте, отменен ли он. Проверьте это http://stackoverflow.com/a/6053943/562840 – Mikel

+0

Вот где начинается funpart. Я запускаю фрагмент, onCreate проверяет, отменена ли задача async раньше. Конечно, это не так, и поэтому он выполняет асинхронную задачу. Теперь, когда я нажимаю на элемент меню навигации, фрагмент запускается снова с нуля, а затем асинтеза не отменяется. Поэтому мне как-то придется отменить его из активности, где задача асинхронизации не найдена. Как это сделать/ – Musterknabe

0

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

+0

PostExecute только запускает цикл for, который добавляет представления к макету. – Musterknabe

+0

И макет является частью фрагмента, который вызывает AsyncTask? Когда вы меняете фрагмент, он уничтожит старый фрагмент View, поэтому вы потеряете макет этого фрагмента. Также об отмене задачи. когда вы отменяете AsyncTask, он все равно вызывает onPostExecute(), поэтому вы можете получить тот же самый крах. И если макет, в котором вы добавляете представления в for-loop, является частью уничтоженного фрагмента, лучше вернуться из onPostExecute через данные интерфейса вы получили из своего источника и внесите все изменения в класс, который реализует интерфейс. Также вам понадобится менеджер, который изменит экземпляр – Eddy

+0

класса, который будет обрабатывать ответы AsyncTask – Eddy

0

Использовать намерение службы для выполнения этой задачи - значит запросить задание в службе намерения что один способен справиться с фоновой задачей без зависания UI

Смежные вопросы