java.lang.IllegalArgumentException - dialog.dismiss 抛出 IllegalArgumentException 异常 - dialog.dismiss。

7

我在我的已发布应用中遇到了这个错误,只有客户端才会收到这个错误。我已经多次尝试复制相同的错误,但都没有成功。我也已经尝试在所有对话框位置使用下面的代码,但也没有解决问题。

if (dialog.isShowing ()) {
    dialog.dismiss ();
}

错误报告

java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{16faa139 V.E..... R.....I. 0,0-0,0} not attached to window manager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:412)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:338)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:122)
at android.app.Dialog.dismissDialog(Dialog.java:522)
at android.app.Dialog.dismiss(Dialog.java:504)

**at br.my.project.de.a(Unknown Source)
at br.my.project.de.onPostExecute(Unknown Source)**

at android.os.AsyncTask.finish(AsyncTask.java:636)
at android.os.AsyncTask.access$500(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6946)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

对话框是在活动还是片段中?当您关闭对话框时,请检查它是否为空。 - Piyush
嗨 @Piyush,对话框位于Activity中。 - tiagosito
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Piyush
@Piyush 好的,我会尝试!但是有没有在开发模式下复制此错误的方法? - tiagosito
4个回答

5

我看到您正在尝试在AsyncTask的postExecute中解除ProgressDialog。这本身是一个好习惯,但有时会出现错误,我以前也遇到过这种情况,特别是当您正在显示ProgressDialog并突然旋转视图时。

我找到了以下解决方案:

您需要使用以下功能来处理正确的解雇并避免崩溃。

private void dismissProgressDialog(ProgressDialog progressDialog) {
            if (progressDialog != null) {
                if (progressDialog.isShowing()) {

                    //get the Context object that was used to create the dialog
                    Context context = ((ContextWrapper) progressDialog.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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                            if (!((Activity) context).isFinishing() && !((Activity) context).isDestroyed()) {
                                dismissWithExceptionHandling(progressDialog);
                            }
                        } else {

                            // Api < 17. Unfortunately cannot check for isDestroyed()
                            if (!((Activity) context).isFinishing()) {
                                dismissWithExceptionHandling(progressDialog);
                            }
                        }
                    } else
                        // if the Context used wasn't an Activity, then dismiss it too
                        dismissWithExceptionHandling(progressDialog);
                }
                progressDialog = null;
            }
        }


public void dismissWithExceptionHandling(ProgressDialog dialog) {
            try {
                dialog.dismiss();
            } catch (final IllegalArgumentException e) {
                // Do nothing.
            } catch (final Exception e) {
                // Do nothing.
            } finally {
                dialog = null;
            }
        }

在您的AsyncTask的onPostExecute中实现该函数。
@Override
 protected void onPostExecute(Boolean b) {
     // pass in the progressDialog as a parameter to the method
     dismissProgressDialog(progressDialog);
 }

2
fun Activity?.dismissDialog(dialog: Dialog?) {
    if (isActivityActive()) {
        dialog?.apply {
            if (isShowing) dismiss()
        }
    }
}


fun Activity?.isActivityActive(): Boolean {
    return null != this && !isFinishing && !isDestroyed
}

1

您正在调用一个已经不再显示的对话框上的 dismiss 方法。例如:当您调用 dismiss 时,您的 Activity/Fragment 可能已经被销毁。


1

在您的活动中编写此代码

onStop()

方法。当任何人按下主页按钮并且如果对话框已打开,则会出现此错误。因为在单击主页按钮时,将调用onPause()和onStop()方法。希望这可以帮助。

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

不起作用。我已经在onPause中调用了dismiss - Kimi Chiu

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