WebView

WebView遇到的问题

2018-04-23  本文已影响0人  lzy2626

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;
            }
    }
上一篇下一篇

猜你喜欢

热点阅读