2012-05-18 3 views
1

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

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

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

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

ответ

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()), он будет отображаться без каких-либо проблем. – yorkw

+0

нерабочий .... –