1、问题描述
在测试过程中反馈的问题,webview加载的一些外部链接,点击返回键无法退出页面,不停的按返回键,就会陷入当前页面刷新的死循环。
返回键执行的逻辑如下:
@Override
public void onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
} else {
super.onBackPressed();
finish();
}
}
2、问题分析
经过排查并分析外部链接的特点,发现无法退出的网页被重定向了。就是当你在访问网页链接A,但是网页链接A因为网页扩展名改变、网站调整、网页迁移等原因强制跳转到了网页B,如果此时你点击进入了网页C,从网页C返回到网页B是正常的,但是从网页B返回到网页A时,网页A就会被强制跳转到网页B,每次返回都会如此,如此循环往复就会陷入一个无法退出的死循环。
3、问题解决
记录WebView开始加载的链接,在网页跳转时做一个处理,代码如下:
private String startUrl; // 记录起始加载url
webView.setWebChromeClient(webViewWebChromeClient);
WebViewClient webViewWebViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (startUrl != null && startUrl.equals(url)) {
view.loadUrl(url);
} else {
// 系统处理
return super.shouldOverrideUrlLoading(view, url);
}
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
startUrl = url;
}
};
4、小结
如果对重定向不了解,可查看百度百科。也有人说重定向问题可与前端人员商量走交互,个人不建议这么做,因为没有从根本上解决问题,最好还是做通用性适配,万一前端需要插入带有重定向网页的链接,还是要改。