1

我的问题与此类似:

在 AsyncTask 中关闭 ProgressDialog 时出错

我有一个 AsyncTask 在 onPreExecute 中创建一个对话框,如下所示:

dialog = ProgressDialog.show(activity, "login", "logging in, one moment please");

并像这样关闭 onPostExecute 中的对话框:

if (dialog != null && dialog.isShowing()) {
    dialog.dismiss();
}

尽管如此,我还是在执行 diolog.dismiss() 的行上收到用户的错误报告,消息是:java.lang.IllegalArgumentException: View not attach to window manager

最常见的根本原因是 - 或者我读过 - 当用户切换方向(从纵向到横向,反之亦然)时。然而,我的应用程序被迫进入纵向模式,所以这不是原因。(我已经仔细检查过,以确保它真的不可能)

前面提到的帖子的记者最终通过在活动类中为 AsyncTask 创建一个内部类并使用活动类中的 onCreateDialog 并从 AsyncTask 调用 showDialog 来解决它(我也在其他地方阅读过这个解决方案)。(如果你不明白这一点,请阅读他的帖子)我已经开始尝试实现这一点,但似乎 showDialog 已被弃用:所以这对我来说不是一个解决方案。

我发现的最后一个解决方案是简单地捕获异常。我自己也想过这个,但只是作为最后的手段。我更愿意了解真正出了什么问题并对此进行预测,而不是简单地捕捉异常而不知道发生了什么。

4

2 回答 2

1

您应该在 manifest.xml 中添加它

最高 API 级别 12

   <activity
        android:label="@string/app_name"
        android:name=".Activity_calling_AsyncTask"
        android:configChanges="keyboardHidden|orientation">

在apl 12级之后,

   <activity
        android:label="@string/app_name"
        android:name=".Activity_calling_AsyncTask"
        android:configChanges="keyboardHidden|orientation|screensize">
  </activity>

希望这会帮助你。

于 2012-09-21T16:08:12.060 回答
0

如果乍得所说的是正确的 - 某些设备可能会在几分之一秒内以横向启动 - 那么我认为这是获得错误报告的最可能原因。虽然 Rajendra 的解决方案可能能够防止这种情况发生,但我认为它确实像其他人指出的那样使用创可贴,因为屏幕旋转并不是真正问题的唯一来源。

经过一番搜索,我找到了两个解决方案:

  1. 将 AsyncTask 实现为继承自 Application 类的类的一部分,此处对此进行了说明:Handle screenorientation changes when there are AsyncTasks running
  2. 实现 onRetainNonConfigurationInstance() / setRetainInstance()。此处给出了第一个示例:http: //twigstechtips.blogspot.com/2011/11/for-my-app-moustachify-everything-i-was.html - 但是,该方法本身已被弃用,因此它会最好以类似的方式使用 setRetainInstance。

为了完整起见,还有Droid-Fu for Android library,声称能够解决这个问题。

于 2012-09-24T07:59:02.737 回答