Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Также имейте в виду, что вы, вероятно, получите исключение 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top