【问题标题】:Android: AsynchTask fails when called from onRestoreInstanceState()Android:从 onRestoreInstanceState() 调用时,AsynchTask 失败
【发布时间】:2011-01-05 17:34:43
【问题描述】:

我有一个应用程序的 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)

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    第 1 步:将您的 AsyncTask 设为静态内部类或常规完整 Java 类。

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

    步骤#3:从onRetainNonConfigurationInstance()返回任务对象

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

    第 4 步:如果需要,修改 onPostExecute() 以不引用活动。

    Here is a sample project 演示此流程。

    【讨论】:

    • 感谢您的详细回复。我实现了您给出的示例,但是现在当我尝试从我的 onRestore 方法执行我的 AsynchTask 时出现此错误: 原因:java.lang.IllegalStateException:无法执行任务:任务已经执行(可以执行任务只有一次)....在 android.os.AsyncTask.execute(AsyncTask.java:383)
    • @ab11:您无法重新执行任务。如果您在旧的activity中执行了任务,您不需要在新的activity中重新执行。
    • 我的任务运行将一些东西处理成一个(当前)不可序列化的对象,然后用于创建 UI。所以在轮换时,这个对象会丢失(因为我目前无法将它序列化到存储的包中),这就是为什么我想重新执行我的 AsynchTask 来恢复它。我可以简单地创建我的 AsynchTask 的一个新实例(而不是像您的示例中那样使用成员变量)。但是即使我这样做并传递 this.MyActivity 作为构造的参数,我仍然会得到原始的“窗口已泄漏”异常。
    • @ab11:“所以在旋转时,这个对象丢失了”——使用onRetainNonConfigurationInstance()(参见步骤#3)。
    • 谢谢。在研究我应该如何使用该方法时,很明显我应该使用 onConfigurationChanged(),这样我就不必担心存储和重新创建这些对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2014-01-16
    相关资源
    最近更新 更多