2013-07-28 28 views
5

在我的應用程序中,我在長時間運行的後臺進程中顯示一個對話框,該對話框是模態的。
當Android從後臺任務返回時,此對話框將被解除。檢查是否可以安全地解除對話框

final ProgressDialog progressDialog = ProgressDialog.show(activity, "", "Doing something long running", true, true); 

new Thread(new Runnable() { 
    public void run() { 
     someLongRunningCode(); // (not using AsyncTask!) 

     activity.runOnUiThread(new Runnable() { 
      public void run() { 
       progressDialog.dismiss(); 
      } 
     }); 
    } 
}).start(); 

然而現在,當用戶旋轉他的設備,而後臺進程仍在運行的活動是重建,因此,該progressdialog會從活動的分離。
當長時間運行的過程完成時,android顯然會嘗試隱藏(現在分離)的進度對話框,然後導致出現異常:java.lang.IllegalArgumentException: View not attached to window manager
是否有任何方法檢查是否可以安全地關閉對話框?

編輯:或者更好的是,有什麼辦法可以將現有的對話框附加到新創建的活動?
一個新的,克隆的對話框會很好。

回答

3

只是發現異常而忽略它。 Android的決定重新啓動循環活動使線程有一些奇怪的例外。但是你想要的最終結果是沒有顯示對話框。如果您剛發現異常,則不會顯示對話框。所以你很好。

如果您沒有爲橫向和縱向使用單獨的佈局/繪圖,那麼您可以在活動的清單中覆蓋configChange,以免它破壞活動(它仍然會正確旋轉併爲您調整大小)。這樣相同的對話框將會啓動,你不應該得到異常。另一個選項需要在onSaveInstanceState和onRestoreInstanceState上進行大量的工作,如果線程在這段時間內實際完成,您需要非常小心計時問題。旋轉想法的整個重新創建活動在多線程中不起作用。

+0

實際上,對我來說最好的解決方案是,如果有任何方法將現有對話框附加到新創建的活動,因爲任務可能仍在運行。有沒有辦法做到這一點?還更新了我的問題以反映這一點。 – PureSpider

+1

如果您沒有爲橫向和縱向使用單獨的佈局/繪圖,則只需在活動的清單中覆蓋configChange,以便它不會破壞活動(它仍會正確旋轉併爲您調整所有內容)。另一個選項需要在onSaveInstanceState和onRestoreInstanceState上進行大量的工作,如果線程在這段時間內實際完成,您需要非常小心計時問題。 –

+0

谷歌不鼓勵這種方法,儘管...爲什麼? – PureSpider

0
if (progressDialog != null) { 
    progressDialog.dismiss(); 
} 
+0

顯然,即使從窗口分離,progressDialog也不爲空。否則我會得到一個NPE,對吧? – PureSpider

+4

是的,你是對的。我的錯 –