在异步任务中关闭对话框时出现IllegalArgumentException

时间:2012-09-21 15:35:31

标签: android dialog android-asynctask illegalargumentexception

我的问题与此类似:

Error on dismissing ProgressDialog in AsyncTask

我有一个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:视图未附加到窗口管理器

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

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

我发现的最后一个解决方案是通过简单地捕获异常。我自己也想过这个,但只是作为最后的手段。我更愿意理解真正出错的地方,并期待这一点,而不是简单地捕捉异常而不知道发生了什么。

2 个答案:

答案 0 :(得分: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>

希望这会对你有所帮助。

答案 1 :(得分:0)

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

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

  1. 将AsyncTask实现为继承自Application类的类的一部分,此处将对此进行说明:Handle screen orientation changes when there are AsyncTasks running
  2. 实现onRetainNonConfigurationInstance()/ setRetainInstance()。这里给出了第一个示例:http://twigstechtips.blogspot.com/2011/11/for-my-app-moustachify-everything-i-was.html - 但是,方法本身已被弃用,因此最好以类似的方式使用setRetainInstance。
  3. 只是为了完整性,还有Droid-Fu for Android library,声称能够解决这个问题。