AsyncTask ProgressDialog не отображается с .get ()

1

Я использую подкласс AsyncTask для некоторой фоновой обработки. Проблема в том, что, когда я использую класс с .get(), ProgressDialog, указанный в onPreExecute(), не отображается.

Я отлично работаю, если я использую обратный вызов с onPostExecute().

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

Может ли кто-нибудь объяснить, почему это поведение так, и если есть обходное решение для этого? Мне бы очень хотелось использовать метод .get() если можно.

Теги:
android-asynctask
android-progressbar

2 ответа

3
Лучший ответ

Сначала я принял другой ответ, но он кажется неправильным.

Метод .get() блокирует поток пользовательского интерфейса, чтобы ждать результата, и любые отображаемые диалоги также будут заблокированы. Это ожидаемое поведение для этого метода.

Единственная альтернатива - не использовать .get() если фоновая активность для любого заметного количества времени и вместо этого использовать методы обратного вызова для вызывающей активности.

1

Вызов AysncTask.get() в потоке пользовательского интерфейса будет блокировать выполнение потока пользовательского интерфейса и сделать поток пользовательского интерфейса, ожидающий завершения AysncTask.doInBackground(). Делая это, вы на самом деле жертвуете преимуществами AsycnTask, теперь весь код выполняется синхронно в потоке пользовательского интерфейса и Background thread (все еще два потока, но поток UI теперь ждет фоновый поток).

Также имейте в виду, что вы, вероятно, получите исключение ANR (заблокировано более 5 секунд), вызвав get() в потоке пользовательского интерфейса.

Если вам действительно нужно его использовать, вызовите метод showDialog() до myAsyncTask.get():

showDialog();
myAsyncTask.execute();
myAsyncTask.get(); // <-- UI thread blocked and wait at this point.
dismissDialog();// <-- This line will be executed after doInBackground() finish.

Надеюсь это поможет.

  • 0
    Да, я думаю ... но я все еще не понимаю, почему диалоговое окно отображается в этом случае, если поток пользовательского интерфейса заблокирован
  • 0
    Суть в том, где вызывать showDialog () в потоке пользовательского интерфейса, если вы вызываете его перед точкой блока (AsyncTask.get ()), он будет отображаться без проблем.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню