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;
}
}
网友评论