2012-07-23 68 views
2

在我的應用程序中,我有幾個執行http請求的AsyncTasks。 如果任務失敗,我向用戶顯示一個DialogFragment。導致空指針崩潰的DialogFragment

ErrorDialogFragment newFragment = ErrorDialogFragment.newInstance(R.string.dialog_message_error); 
newFragment.show(getFragmentManager(), ConstantHandler.DIALOG_ERROR); 

的問題是,用戶有時退出活動或之前的AsyncTask應用程序完成時,造成在getFragmentManager一個零指示字例外。

我的問題是,如果有一種方法可以避免這種情況,除非跟蹤每個片段和活動是否仍在運行?

回答

3

我以前有過同樣的問題。我在博客某處(我已經忘記)看到了一個相當好的答案,如下所示:

爲您的AsyncTasks提供對當前上下文的引用。當您的應用程序最小化/旋轉時,使用onRetainNonConfigurationInstance()getLastNonConfigurationInstance()保存您的AsyncTasks。然後,當您的應用重新啓動時,在onCreate()中,您可以檢查是否有從getLastNonConfigurationInstance()傳回的AsyncTask。如果存在,則將其設置爲您活動的新上下文的上下文。現在您的AsyncTask將能夠訪問新的上下文並完成其任務。

爲了徹底,您可能還希望在您的AsyncTasks中將您的上下文設置爲null,然後使用onRetainNonConfigurationInstance()保存它們。然後在你的AsyncTask中,在嘗試使用它之前檢查Context是否爲空。如果AsyncTask在後臺嘗試使用上下文,這將停止應用程序崩潰。

+0

感謝您的回答。儘管如此,仍然看到更多的工作,然後只是跟蹤每個活動。現在我在onCreate中設置activityAlive布爾值爲true,在onDestroy中設置false,並在顯示對話框之前執行活動檢查。 – Slickelito 2012-07-23 08:38:20

+0

它確實看起來像一個痛苦。我正忙着寫下我的下一個應用程序,並試圖避免對話。輪換/最小化問題只是一個痛苦。 – 2012-07-23 09:16:25

+0

給予應有的抵免。以下是帖子:http://blog.doityourselfandroid.com/2010/11/14/handling-progress-dialogs-and-screen-orientation-changes/ – 2012-07-23 10:25:22