2012-05-18 115 views
1

我使用AsyncTask子類進行一些後臺處理。問題是,當我用.get()方法使用該類時,我在onPreExecute()中指定的ProgressDialog未顯示。AsyncTask ProgressDialog不以.get()顯示

如果我使用onPostExecute()方法進行回調,則工作正常。

我的第一個想法是,這是因爲.get()等待進程完成,但不能阻止UI線程,所以情況並非如此。

任何人都可以解釋爲什麼這種行爲是如此,如果有一個解決方法?如果可以,我真的很想使用.get()方法。

回答

3

我最初接受了其他答案,但它似乎是錯誤的。

.get()方法將阻止UI線程等待結果,並且任何顯示的對話框也將被阻止。這是此方法的預期行爲。

唯一的選擇是不使用.get()如果後臺活動的時間長達任何可觀的時間,而是將回調方法用於調用活動。

1

在UI線程上調用AysncTask.get()將阻止UI線程執行並使UI線程等待AysncTask.doInBackground()完成。通過這樣做,你實際上犧牲了AsycnTask的好處,現在所有代碼都在UI線程和後臺線程(仍然是兩個線程,但UI線程現在等待後臺線程)中同步執行。另外請記住,通過在UI線程上調用get(),您可能會得到ANR異常(阻塞超過5秒)。

如果你真的要使用它,請致電您的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

是啊我猜...但我仍然不明白爲什麼對話框顯示在這種情況下,如果UI線程被阻止 –

+0

這裏的要點是在UI線程上調用showDialog()的地方,塊點(AsyncTask.get()),它將顯示沒有任何問題。 – yorkw

+0

不能正常工作.... –