【问题标题】:How to resolve : android.view.WindowManager$BadTokenException - is your activity running?如何解决:android.view.WindowManager$BadTokenException - 您的活动是否正在运行?
【发布时间】:2015-07-16 14:46:10
【问题描述】:

我有一个包含很多对话框的活动,例如 Dialog_1、Dialog_2、Dialog_3,我在其中一个对话框中实现了一个 WebView,比如说 Dialog_2。当浏览对话框时,第一次打开带有 WebView 的 Dialog_2 没有问题,但第二次当我导航到 Dialog_3 并返回到 Dialog_2 或 Dialog_1 到 Dialog_2 并触摸 WebView 时,我收到如下所述的错误。

我查看了Bad token exception,但仍然无法使用

     if (! this.isFinishing()) {
        showDialog(DIALOG_ADD_A_PERSON_BODY_MAP)
    }

致命异常:主要 android.view.WindowManager$BadTokenException: 无法添加窗口——令牌 android.view.ViewRootImpl$W@41ec0fc8 无效;您的活动正在进行吗?

FATAL EXCEPTION: main
android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@41ec0fc8 is not valid; is your activity running?
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:806)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:265)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:73)
        at android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:373)
        at android.webkit.ZoomControlEmbedded.show(ZoomControlEmbedded.java:41)
        at android.webkit.ZoomManager.invokeZoomPicker(ZoomManager.java:1728)
        at android.webkit.WebViewClassic.startDrag(WebViewClassic.java:11645)
        at android.webkit.WebViewClassic.handleTouchEventCommon(WebViewClassic.java:11170)
        at android.webkit.WebViewClassic.onHandleUiTouchEvent(WebViewClassic.java:3225)
        at android.webkit.WebViewClassic.onHandleUiEvent(WebViewClassic.java:3135)
        at android.webkit.WebViewClassic.access$12000(WebViewClassic.java:278)
        at android.webkit.WebViewClassic$PrivateHandler.dispatchUiEvent(WebViewClassic.java:13405)
        at android.webkit.WebViewInputDispatcher.dispatchUiEvent(WebViewInputDispatcher.java:1078)
        at android.webkit.WebViewInputDispatcher.dispatchUiEvents(WebViewInputDispatcher.java:1066)
        at android.webkit.WebViewInputDispatcher.access$300(WebViewInputDispatcher.java:78)
        at android.webkit.WebViewInputDispatcher$UiHandler.handleMessage(WebViewInputDispatcher.java:1392)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:176)
        at android.app.ActivityThread.main(ActivityThread.java:5365)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
        at dalvik.system.NativeStart.main(Native Method)

对话框代码是

case DIALOG_ADD_A_PERSON_BODY_MAP:
                try {
                    LayoutInflater inflaterBodyMap = this
                            .getLayoutInflater();
                    final View inflatorBodyMap = inflaterBodyMap
                            .inflate(
                                    R.layout.dialog_incident_window_body_map,
                                    null);
                    bodyMapWebView  = (WebView) inflatorBodyMap.findViewById(R.id.webView);
                    bodyMapWebView.getSettings().setJavaScriptEnabled(true);
                    //bodyMapWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
                    //bodyMapWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
                    bodyMapWebView.getSettings().setBuiltInZoomControls(true);
                    bodyMapWebView.getSettings().setSupportZoom(true);

                    bodyMapWebView.loadUrl("https://www.google.co.uk");

                    bodyMapWebView.addJavascriptInterface(new WebAppInterface(this), "Android");                    
                    builder.setTitle("Injured person");
                    builder.setView(inflatorBodyMap);

                    builder.setPositiveButton("Next",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                                    int which) {
                                    showDialog(DIALOG_ADD_A_PERSON_WAS_THE_PERSON_INJURED_ET);
                                    wasThePersonInjured.setText(map_incident_addAPerson.get("InjuredNotes"));


                                }
                            });
                    builder.setNegativeButton("Back",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                                    int which) {


                                    showDialog(DIALOG_ADD_A_PERSON_WAS_THE_PERSON_INJURED);

                                }
                            });
                    return builder.create();
                } catch (Exception e) {
                    e.printStackTrace();
                }

如何解决此错误。非常感谢您的帮助和建议。

【问题讨论】:

    标签: android webview dialog android-alertdialog


    【解决方案1】:

    如果您的 Activity 由于某种原因被终止并且您的 Activity 的窗口令牌已过期,但您仍然尝试访问它,则会发生这种情况。所以要解决这个问题,把它放在onPause:

     @Override
     protected void onPause() {
         super.onPause();
    
         if ((progress != null) && progress.isShowing()) {
            progress.dismiss();
         }
         progress = null;
     }
    

    【讨论】:

    • 您好,感谢您的回复,您所说的“进步”是什么?
    • progress 是您的对话框实例,可以是 ProgressDialog 或只是 Dialog
    • 当我这样做时,现在我没有收到错误,但是当我在那个对话框中并且我锁定屏幕时,它会关闭对话框。当用户锁定屏幕时,我不想关闭对话框。
    • 添加了这段代码,它可以工作,这是正确的做法吗? if ((alertBodyMap == null) && !alertBodyMap.isShowing()){ alertBodyMap.dismiss(); alertBodyMap = null; }
    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2016-11-26
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多