我似乎在計時線程和對話窗口方面存在一致的問題。我試過使用線程或onCreate/onPrepare或AsyncTask在後臺執行一些下載/處理。通常,當後臺處理完成並解除對話窗口時,控制似乎返回到根線程(活動/ UI線程?)之前對話框消失或類似onPostExecute的過程完成。這讓我覺得我做錯了。下面是一個典型結構(僞代碼):無序多線程處理和對話框的Android問題
public class X {
protected String result = null;
protected ProgressDialog progressDialog;
public void onCreate() {
...
new XTask().execute();
progressDialog.show();
// result is null here, should be "hi"?
// do things with result, like barf on a NPE...sigh
}
private class XTask extends AsyncTask {
protected doInBackground() {
// Get URL.
// Look at contents, takes a few seconds.
// Return the result (should get sent to onPostExecute).
}
protected onPostExecute(r) {
result = r;
progressDialog.dismiss();
}
}
}
我認爲,後doPostExecute套導致和消除對話框,處理然後繼續在onCreate方法。但是,onCreate中的結果往往(並非總是)爲空。有一個更好的方法嗎?這是否只是由於模擬器的普遍興趣?
謝謝。
編輯:爲了更具體一些,我的任務(在doInBackground中)獲取一個URL並對響應做一些處理。這個過程需要1-3秒。然後,理論上,onPostExecute將X.result設置爲所提取的內容。我知道網址內容是有效的,而且迴應很好(非空)。問題是,在那1-3秒內,控制權返回到onCreate,就好像progressDialog根本沒有生存過(它根本不會顯示在模擬器中,但這是正常的)。
我以爲調用dialog.show()是一種阻塞方法,即出現對話框,並且該方法在它消失之前不會繼續,但似乎並非如此。或者我的progressDialog.dismiss()在之前被調用,它應該在設置X.result之前,或者根本沒有被調用,或者dismiss()在賦值之前更快/完成,否則完全是錯誤的。
更改execute和progressDialog的順序沒有幫助,也沒有將它移到onPreExecute()中。奇怪的是,onPostExecute不會被調用,直到我在onCreate返回。如果我在執行後有一個Thread.sleep循環(我認爲給它時間會有幫助),它將永遠不會完成任務,直到該循環結束並返回。例如:
new XTask().execute();
int z=0;
while (response == null && z < 50) {
Thread.sleep(500);
z++;
}
if (response == null) return;
任務的onPostExecute方法直到「返回」纔會被調用。嗯......也許正在onCreate正在影響它。
我試過了,它沒有幫助。我的印象是,dialog.show()阻止了調用方法的繼續,但我猜不是(至少不是在「模擬器」中)。我更新了我的問題。感謝您的建議! – Josh