Android:从onRestoreInstanceState()调用异步任务失败

时间:2011-01-05 17:34:43

标签: android android-asynctask

我有一个应用程序的UI需要一些工作来构建(必须处理一些东西)。因此,我使用AsynchTask构建UI(它在进行一些后台处理时显示进度对话框,然后进行UI更新)。我希望能够从OnRestoreInstanceState()调用此AsynchTask,以便我可以在旋转时重建UI。但是,当我从onRestorInstanceState()方法调用MyAsynchTask.execute()时,我得到以下异常:

01-05 12:28:45.194: ERROR/WindowManager(409): android.view.WindowLeaked: Activity com.MyActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43e70368 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)

1 个答案:

答案 0 :(得分:3)

步骤#1:使AsyncTask成为静态内部类或常规完整Java类。

步骤2:通过构造函数参数手动关联任务应该使用的活动,该参数保存在任务的数据成员中。

步骤3:从onRetainNonConfigurationInstance()

返回任务对象

步骤#4:在新活动实例的onCreate()中,通过getLastNonConfigurationInstance()获取现有任务对象,并通过setter方法手动重新关联任务应该使用的活动。

步骤4:如果需要,修改onPostExecute()以不参考活动。

Here is a sample project证明了这一流程。