WindowManagerGlobal: android.view.WindowLeaked 及WebView页面点击无效

05-24 17:45:48.090 2811-2811/com.yuanzong.lawmachine E/WindowManagerGlobal: android.view.WindowLeaked: Activity com.
xxxx has leaked window com.android.internal.policy.impl.PhoneWindow D e c o r V i e w 1 d 1 f f 6 d 5 V . E . . . . . R . . . . . . D 0 , 0 − 870 , 284 t h a t w a s o r i g i n a l l y a d d e d h e r e a t a n d r o i d . v i e w . V i e w R o o t I m p l . < i n i t > ( V i e w R o o t I m p l . j a v a : 398 ) a t a n d r o i d . v i e w . W i n d o w M a n a g e r G l o b a l . a d d V i e w ( W i n d o w M a n a g e r G l o b a l . j a v a : 286 ) a t a n d r o i d . v i e w . W i n d o w M a n a g e r I m p l . a d d V i e w ( W i n d o w M a n a g e r I m p l . j a v a : 85 ) a t a n d r o i d . a p p . D i a l o g . s h o w ( D i a l o g . j a v a : 298 ) a t a n d r o i d . a p p . A l e r t D i a l o g DecorView{1d1ff6d5 V.E..... R......D 0,0-870,284} that was originally added here at android.view.ViewRootImpl.<init>(ViewRootImpl.java:398) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:286) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) at android.app.Dialog.show(Dialog.java:298) at android.app.AlertDialog DecorView1d1ff6d5V.E.....R......D0,0870,284thatwasoriginallyaddedhereatandroid.view.ViewRootImpl.<init>(ViewRootImpl.java:398)atandroid.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:286)atandroid.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)atandroid.app.Dialog.show(Dialog.java:298)atandroid.app.AlertDialogBuilder.show(AlertDialog.java:993)
at android.webkit.JsDialogHelper.showDialog(JsDialogHelper.java:128)
at com.android.webview.chromium.WebViewContentsClientAdapter.showDefaultJsDialog(WebViewContentsClientAdapter.java:940)
at com.android.webview.chromium.WebViewContentsClientAdapter.handleJsAlert(WebViewContentsClientAdapter.java:849)
at org.chromium.android_webview.AwContentsClientBridge$$Lambda 2. r u n ( U n k n o w n S o u r c e ) a t a n d r o i d . o s . H a n d l e r . h a n d l e C a l l b a c k ( H a n d l e r . j a v a : 739 ) a t a n d r o i d . o s . H a n d l e r . d i s p a t c h M e s s a g e ( H a n d l e r . j a v a : 95 ) a t a n d r o i d . o s . L o o p e r . l o o p ( L o o p e r . j a v a : 135 ) a t a n d r o i d . a p p . A c t i v i t y T h r e a d . m a i n ( A c t i v i t y T h r e a d . j a v a : 5289 ) a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( N a t i v e M e t h o d ) a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( M e t h o d . j a v a : 372 ) a t c o m . a n d r o i d . i n t e r n a l . o s . Z y g o t e I n i t 2.run(Unknown Source) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5289) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit 2.run(UnknownSource)atandroid.os.Handler.handleCallback(Handler.java:739)atandroid.os.Handler.dispatchMessage(Handler.java:95)atandroid.os.Looper.loop(Looper.java:135)atandroid.app.ActivityThread.main(ActivityThread.java:5289)atjava.lang.reflect.Method.invoke(NativeMethod)atjava.lang.reflect.Method.invoke(Method.java:372)atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:963)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758)
05-24 17:54:49.443 520-640/system_process W/InputDispatcher: Asynchronous input event injection failed.
05-24 17:55:06.348 520-640/system_process W/InputDispatcher: Asynchronous input event injection failed.

现象: 从一个WebView跳转到另一个 WebView页面,网页弹出alert页面,没有点击确定或者取消,直接返回,第一个WebView无法点击

原因: 可能是多个WebView共用同一个 webview kernal,如果没有处理完alert事件(阻塞操作),会导致 webview kernal事件阻塞

解决: 自定义 WebView中WebChromeClient#onJsAlert回调,手动处理弹窗显示,取消操作, js alert事件

@Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                if (alertDialog != null) {
                    alertDialog.dismiss();
                    jsResult.cancel();
                }

                jsResult = result;
                alertDialog = new AlertDialog.Builder(view.getContext())
                        .setTitle(url)
                        .setPositiveButton("确定", (dialog, which) -> {
                            result.confirm();
                        })
                        .setMessage(message)
                        .create();
                alertDialog.show();
                return true;
            }

同时在WebView销毁的时候,处理释放alert事件

 public void onDestroy() {
        if (alertDialog != null) {
           Leon.d(TAG,"onDestroy dismiss dialog");
            if (jsResult != null) {
                jsResult.cancel();
            }
            alertDialog.dismiss();
        }
        onDetachedFromWindow();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值