美文网首页WebView
WebView遇到的问题

WebView遇到的问题

作者: lzy2626 | 来源:发表于2018-04-23 17:35 被阅读0次

    1.场景说明:进行芝麻认证:通过webview打开支付宝提供的H5,传入姓名和身份证号码进行认证,认证成功后,在回调中我们打开了一个显示“认证成功”的界面,并包含一个确定按钮,点击这个按钮之后关闭整个activity

    2.神坑过程:点击按钮关闭activity这个操作,一般都是用android与js的交互,这个我就不多说了。但ios那边不知什么原因,提出的方案是要通过弹出alert的方式,说只能用这样的方式(感到不解),没办法只能用这种方式,在alert的触发回调中处理,代码如下:

        webView.setWebChromeClient(new WebChromeClient() {
    
                @Override
                public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                    System.out.println("onJsAlert");
                    //alert 回调 :跳转,关闭webviewActivity
    
                    Intent intent =   new Intent(WebViewActivity.this, MainContentActivity.class);
                    intent.putExtra("index","webview");
                    startActivity(intent);
                    finish();
                    return true;
                }
       }
    

    3.出现bug:按照上面的写了之后出现了这样的问题,完成认证之后,跳转到其它的界面后,再次进入webview之后,webview加载不出内容了,白屏一片。OK,没问题,加载不出来无所谓啦,大不了重进,忽悠产品说,偶尔出现而已啦。然而啊,你重进页面没有用,你会发现整个应用任何用webview的地方都加载不出东西来,好了,玩不下去了。
    跟下去,发现底层有一条叫webcore(印象中是这个名字)的线程一直处于wait的状态,再也恢复不了了,唯一拯救就是杀进程。

    4.解决:首先找到了触发原因,只要点击“确认按钮”就出现了这样的bug。
    然后研究了一下onJsAlert 发现,在回调中必须处理result才行,添加之后,解决问题。

         webView.setWebChromeClient(new WebChromeClient() {
    
                @Override
                public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            
                    result.cancel();//必须处理,否则会出现问题。
                    Intent intent =   new Intent(WebViewActivity.this, MainContentActivity.class);
                    intent.putExtra("index","webview");
                    startActivity(intent);
                    finish();
                    return true;
                }
        }
    

    相关文章

      网友评论

        本文标题:WebView遇到的问题

        本文链接:https://www.haomeiwen.com/subject/fvmllftx.html