2011-01-05 80 views
2

我有一個應用程序誰的UI需要一些工作來構建(必須處理一些東西)。所以,我使用AsynchTask構建UI(它在進行一些後臺處理時顯示進度對話框,然後進行UI更新)。我希望能夠從OnRestoreInstanceState()中調用此AsynchTask,以便我可以在旋轉時重建UI。然而,當我打電話從onRestorInstanceState()方法MyAsynchTask.execute(),我得到以下異常:Android:從onRestoreInstanceState()調用AsynchTask失敗

01-05 12:28:45.194: ERROR/WindowManager(409): android.view.WindowLeaked: Activity com.MyActivity has leaked window [email protected] that was originally added here 
01-05 12:28:45.194: ERROR/WindowManager(409):  at android.view.ViewRoot.<init>(ViewRoot.java:247) 
01-05 12:28:45.194: ERROR/WindowManager(409):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
01-05 12:28:45.194: ERROR/WindowManager(409):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
01-05 12:28:45.194: ERROR/WindowManager(409):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
01-05 12:28:45.194: ERROR/WindowManager(409):  at android.app.Dialog.show(Dialog.java:241) 
01-05 12:28:45.194: ERROR/WindowManager(409):  at com.MyClass$MyAsynchTask.onPreExecute(MyClass.java:428) 

回答

3

第1步:請AsyncTask靜態內部類或常規的全Java類。

步驟#2:通過任務的數據成員中保存的構造函數參數手動關聯任務應該使用的活動。

第3步:從onRetainNonConfigurationInstance()

第4步返回任務目標:在新的活動實例的onCreate(),通過getLastNonConfigurationInstance()獲取現有任務對象和手動任務應通過合作活動重新關聯一個setter方法。

步驟4:如果需要,請修改以不參考活動。

Here is a sample project展示了這個流程。

+0

感謝您的詳細回覆。我實現了你給出的例子,但是現在當我嘗試從我的onRestore方法執行AsynchTask時,出現這個錯誤:由於:java.lang.IllegalStateException:無法執行任務:任務已經執行(任務可以執行只有一次)....在android.os.AsyncTask.execute(AsyncTask.java:383) – ab11 2011-01-05 20:13:10

+0

@ ab11:你不能重新執行任務。如果您在舊活動中執行任務,則無需在新活動中重新執行該任務。 – CommonsWare 2011-01-05 20:35:59

+0

我的任務運行時將一些東西處理成(當前)不可序列化的對象,然後用它來創建UI。所以在一個循環中,這個對象會丟失(因爲我目前無法將它序列化到存儲的包中),這就是爲什麼我想重新執行我的AsynchTask,以便恢復它。我可以簡單地創建一個新的AsynchTask實例(與使用成員變量相反,如您的示例)。但即使我這樣做,並通過this.MyActivity作爲參數的建設,我仍然得到原來的「窗口已泄漏」的例外。 – ab11 2011-01-05 20:46:46