非法参数异常?为什么?

9

有人能解释一下为什么会出现这个错误吗?或者更好的方法是如何处理它?我无法重现它。这是那种千载难逢的错误之一。

背景:用户正在尝试登录,进度对话框正在显示,异步任务中发送了一个HTTP请求,进度对话框被取消。错误发生,应用程序崩溃。

LoginActivity.java

 255:   private void dismissProgress() {  
 256:     if (mProgress != null) {  
 257:         mProgress.dismiss();  
 258:         mProgress = null;  
 259:     }  
 260:   }  

java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:391)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:236)
at android.view.Window$LocalWindowManager.removeView(Window.java:432)
at android.app.Dialog.dismissDialog(Dialog.java:278)
at android.app.Dialog.access$000(Dialog.java:71)
at android.app.Dialog$1.run(Dialog.java:111)
at android.app.Dialog.dismiss(Dialog.java:268)
at se.magpern.LoginActivity.dismissProgress(LoginActivity.java:257)
at se.magpern.LoginActivity.access$5(LoginActivity.java:255)
at se.magpern.LoginActivity$DoTheLogin.onPostExecute(LoginActivity.java:293)
at se.magpern.LoginActivity$DoTheLogin.onPostExecute(LoginActivity.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:417)
at android.os.AsyncTask.access$300(AsyncTask.java:127)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:144)
at android.app.ActivityThread.main(ActivityThread.java:4937)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

这是在您的活动已经暂停后调用的吗? - EboMike
相关:https://dev59.com/OnE85IYBdhLWcg3wgDvd - Bert F
2个回答

15

如果用户在您的任务运行时要么关闭了视图(例如,一个可以退出的对话框),要么切换到另一个活动,则会发生这种情况。你应该认真考虑使用 Android 的activity-native对话框显示/关闭,而不是尝试自己保持对视图的引用。但如果您自己处理,可能需要使用对话框的isShowing()方法检查对话框是否正在显示,然后再尝试解除它。


当然可以!感谢您的提示,因为方向变化导致了应用程序的FC。 - Magnus
非常好的答案!!帮了很多忙 :) - info

6
我见过这种情况发生在进度对话框已经完全或部分解散的情况下,有潜在更新。用户要求关闭时,操作系统正在尝试关闭视图,并且它已经与窗口断开连接,或者反之亦然。
当用户点击按钮时关闭进度窗口的代码和以其他方式关闭进度窗口的代码之间存在竞争条件。最可能出现此竞争条件的位置是将您关闭窗口的请求放置在视图线程(按钮处理程序或代码回调)上的地方。

谢谢。我会进行更多测试,看看是否可以以某种方式中断对话框。目前用户无法关闭对话框,并且对话框没有使用任何进度更新(它只是旋转)。解雇在onPostExecute中完成,因此应该在同一线程中。 - Magnus
2
@Magnus 你认为这个竞态条件可能是由于方向改变与AsyncTask尝试关闭对话框同时发生所导致的吗? - dave.c
正如大家所指出的,这里有很多可能出错的地方,包括方向变化。您可以注意到,因为我们在您的堆栈中看到了AsyncTask,它是第二个加入的,因此其他某些事情(方向更改、用户解除)已经到达那里了。 - Nick Campion
是的!在我看到你的评论之前,我就已经想到了。这发生在方向改变时。我已经在其他视图中禁止了方向改变,但没有在这个视图中。现在我知道问题所在,解决方案就近在眼前。谢谢! - Magnus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接