2013-04-24 3 views
0

Я использовал AsyncTask для запроса большого объема данных. При получении данные обрабатываются внутри метода onPostExecute. Для обработки данных может потребоваться некоторое время.Пользовательский интерфейс пользователя зависает в onPostExecute AsyncTask?

Основываясь на моем понимании, AsyncTask является асинхронным и не зависит от пользовательского интерфейса.

  • Почему моя активность зависает onPostExecute?
  • Это нормально для Activity, чтобы заморозить, если обработка внутри метода onPostExecute слишком длинная?
  • Как сделать так, чтобы мой Activity не замерзал onPostExecute?
+0

есть ли в другой долгосрочной перспективе задача в onPostexecute? –

+0

@ankitmakwana: Да, но 'onPostExecute' является частью' AsyncTask'.И если 'AsyncTask' является асинхронным, длительный процесс внутри' onPostExecute' не должен блокировать активность, поскольку он работает в отдельном потоке. – Arci

ответ

2
  1. Вы должны делать все операции DataSource как (database , network ,parsing response.etc) в doInBackground методе.
  2. Если вы хотите обновить любое щий Updation в асинхронной задаче ЕГЭ onProgressUpdate
  3. Я думаю, что вы выполняете какие-либо операции синтаксического анализа в onPostExecute. попробуйте получить фильтр или parseddata (более легкие данные) в postexecute.
0

Удостоверьтесь, что вы используете метод doInBackground в своем методе AsynTask.

+0

Переместите свою длинную операцию в doInBackground. –

1

Почему моя активность зависает onPostExecute?

По вашему сообщению вы выполняете некоторую трудоемкую операцию по методу PostExecute. В PostExecute работает на потоке пользовательского интерфейса, так что это хорошо, что вы UI замерзаете.

Нормально ли для активности заморозить, если обработка внутри метода onPostExecute слишком длинная?

Да, это так. Вы должны выполнять длительную работу в методе doInBackground (не-UI потока)

Как сделать это таким образом, что моя активность не замерзнет onPostExecute?

Попробуйте перенести деятельность долгого времени методы doInBackground и в PostExecute просто обновить пользовательский интерфейс в соответствии ответ, который вы получите после операций в методе doInBackground.

+0

Не могли бы вы объяснить, почему длительный процесс внутри 'onPostExecute' может вызвать зависание экрана? Это потому, что я думал, что 'onPostExecute' является асинхронным. – Arci

+0

Да, вы правы. –

+0

Спасибо @Nickolai! Я хотел проверить ваш ответ, но Гани дал мне решение моей проблемы, которая заключается в том, чтобы ставить долгосрочную задачу внутри 'onProgressUpdate'. Я делаю обновление пользовательского интерфейса, поэтому я не могу поместить свой код внутри 'doInBackground'. – Arci

0

см Long Запуск задачи вам нужно Bind в doInBackground здесь вы не можете Bind управления UI Like Button, ImageView и т.д. После завершения doInBackground в onPostExecute вы можете связать все Требовать управления, убедитесь, что здесь [onPostExecute] Вы не стереосистеме и обновите Еще одна задача.

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