我有一个应用程序的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)
答案 0 :(得分:3)
步骤#1:使AsyncTask
成为静态内部类或常规完整Java类。
步骤2:通过构造函数参数手动关联任务应该使用的活动,该参数保存在任务的数据成员中。
步骤3:从onRetainNonConfigurationInstance()
步骤#4:在新活动实例的onCreate()
中,通过getLastNonConfigurationInstance()
获取现有任务对象,并通过setter方法手动重新关联任务应该使用的活动。
步骤4:如果需要,修改onPostExecute()
以不参考活动。
Here is a sample project证明了这一流程。