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,0−870,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();
}