2011-09-15 60 views
4

我的應用程序中有一些活動會觸及Web服務。由於我不想撐起主線程,所以這段代碼在AsyncTask中。但是,我不希望用戶在調用Web服務時操作Activity,因此在執行AsyncTask之前,我會顯示一個ProgressDialog,它會旋轉並阻止屏幕。在AsyncTask的onPostExecute方法中,我所做的第一件事是關閉ProgressDialog。AsyncTask onPostExecute沒有在主線程上運行?

這應該阻止用戶在不實際阻塞主線程的情況下操作活動。

但是,我已經注意到ProgressDialog是的幾次,從來沒有被解僱,並且用戶被卡住了。 AsyncTask已完成,onPostExcute已執行,但ProgressDialog仍顯示。 ProgressDialog沒有機會被解僱,用戶被困在屏幕上。他們唯一的選擇是訪問Android設置應用程序並強制停止我的應用程序。

有沒有人有任何想法,爲什麼會發生這種情況?我能做些什麼來解決它?

相關代碼:

我這是怎麼顯示ProgressDialog和啓動任務:

mProgress = ProgressDialog.show(this, "", "Syncing...", true); 
(new MyAsyncTask()).execute(intUserId); 

這是onPostExcute的任務。沒有 「@覆蓋」

protected void onPostExecute(Boolean result) { 
     if (mProgress != null) { 
      mProgress.dismiss(); 
      mProgress = null; 
     } 
    } 
+0

聽起來像是調試 –

+2

職位,您可以粘貼您正在使用的代碼的相關部分?它有時與您所忽視的對話框的實例有關。我的意思是,像旋轉手機這樣的東西可能會導致重新創建一個新的對話框,有時候你會忽略對話框的另一個參考。 – Cristian

+1

也看到這篇文章:http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change-is-there-any-100-working –

回答

1

檢查:

  1. 確保您的UI線程調用asynctack.execute()
  2. onPostExcute()上使用@Override以確保它已正確定義。
+1

我認爲'onPostExecute'被正確定義,因爲安德魯說它是一個間歇性的錯誤。 – Cristian

+0

我認爲從UI線程調用asynctack.execute()是一個重要問題 – Fatih

0

也許嘗試在onPreExecute()方法中顯示ProgressDialog?

protected void onPreExecute() { 
    mProgress = ProgressDialog.show(this, "", "Syncing...", true); 
} 

給一個鏡頭,看看它是否工作。

相關問題