我有以下一些例外:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:191)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Dialog.onWindowAttributesChanged(Dialog.java:596)
at android.view.Window.setDefaultWindowFormat(Window.java:1013)
at com.android.internal.policy.impl.PhoneWindow.access$700(PhoneWindow.java:86)
at com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:1951)
at com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:1889)
at android.view.ViewRoot.performTraversals(ViewRoot.java:727)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4338)
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:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
我用谷歌搜索了一下,发现它与弹出窗口和翻转屏幕有关,但没有引用我的代码。
问题是:
除了翻转屏幕之外,是否有办法确切地找出此问题何时发生?是否有其他事件或操作触发了此错误?
发布于 2011-06-05 08:51:25
我遇到了这个问题,在屏幕方向更改时,活动在AsyncTask和进度对话框完成之前完成。我似乎通过将对话框设置为空onPause()
,然后在消除之前在AsyncTask中检查它来解决这个问题。
@Override
public void onPause() {
super.onPause();
if ((mDialog != null) && mDialog.isShowing())
mDialog.dismiss();
mDialog = null;
}
..。在我的AsyncTask中:
protected void onPreExecute() {
mDialog = ProgressDialog.show(mContext, "", "Saving changes...",
true);
}
protected void onPostExecute(Object result) {
if ((mDialog != null) && mDialog.isShowing()) {
mDialog.dismiss();
}
}
发布于 2017-01-17 22:53:10
经过与这个问题的斗争,我最终得到了这个变通方法:
/**
* Dismiss {@link ProgressDialog} with check for nullability and SDK version
*
* @param dialog instance of {@link ProgressDialog} to dismiss
*/
public void dismissProgressDialog(ProgressDialog dialog) {
if (dialog != null && dialog.isShowing()) {
//get the Context object that was used to great the dialog
Context context = ((ContextWrapper) dialog.getContext()).getBaseContext();
// if the Context used here was an activity AND it hasn't been finished or destroyed
// then dismiss it
if (context instanceof Activity) {
// Api >=17
if (!((Activity) context).isFinishing() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
if (!((Activity) context).isDestroyed()) {
dismissWithExceptionHandling(dialog);
}
} else {
// Api < 17. Unfortunately cannot check for isDestroyed()
dismissWithExceptionHandling(dialog);
}
}
} else
// if the Context used wasn't an Activity, then dismiss it too
dismissWithExceptionHandling(dialog);
}
dialog = null;
}
}
/**
* Dismiss {@link ProgressDialog} with try catch
*
* @param dialog instance of {@link ProgressDialog} to dismiss
*/
public void dismissWithExceptionHandling(ProgressDialog dialog) {
try {
dialog.dismiss();
} catch (final IllegalArgumentException e) {
// Do nothing.
} catch (final Exception e) {
// Do nothing.
} finally {
dialog = null;
}
}
有时,如果这个问题没有更好的解决方案,好的异常处理也能很好地工作。
发布于 2015-03-14 03:26:01
如果有一个Activity
对象挂起,可以使用isDestroyed()
方法:
Activity activity;
// ...
if (!activity.isDestroyed()) {
// ...
}
如果您有一个在不同地方使用的非匿名AsyncTask
子类,这是很好的。
https://stackoverflow.com/questions/2224676
复制相似问题