Я использую подкласс AsyncTask
для некоторой фоновой обработки. Проблема в том, что, когда я использую класс с .get()
, ProgressDialog
, указанный в onPreExecute()
, не отображается.
Я отлично работаю, если я использую обратный вызов с onPostExecute()
.
Моя первая мысль заключалась в том, что это произошло потому, что .get()
ждет завершения процесса, но это не может блокировать поток пользовательского интерфейса либо так, что это не так.
Может ли кто-нибудь объяснить, почему это поведение так, и если есть обходное решение для этого? Мне бы очень хотелось использовать метод .get()
если можно.
Сначала я принял другой ответ, но он кажется неправильным.
Метод .get()
блокирует поток пользовательского интерфейса, чтобы ждать результата, и любые отображаемые диалоги также будут заблокированы. Это ожидаемое поведение для этого метода.
Единственная альтернатива - не использовать .get()
если фоновая активность для любого заметного количества времени и вместо этого использовать методы обратного вызова для вызывающей активности.
Вызов 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.
Надеюсь это поможет.