在Android开发过程中,使用过WebView的童鞋可能难免会遇到URL重定向问题。
简单叙述下这种问题的情况,就是WebView首先加载A链接,然后在WebView上点击一个B链接进行加载,B链接会自动跳转到C链接,这个时候调用WebView的goback方法,会返回到加载B链接,但是B链接又会跳转到C链接,从而导致没法返回到A链接界面(当然也有朋友说快速的按两次返回键-也就是连续触发了两次goback可以返回到A链接,但并不是所有用户都懂这个,而且操作上也很恶心。),这就是重定向问题。
这个问题由来已久,网上解决办法也有好几种,但是都没有什么很好的统一的解决方式,QQ微信之类的内置浏览器做的很好,不过不知道其实现方式。
以往的解决思路就是包括自己维护webview的url历史栈,或者前后端勾兑好,或者依赖服务器之类的什么没试过的xx方式,见链接:
http://blog.csdn.net/t12x3456/article/details/39134961
内容就各位慢慢去体会,也是一种思考的过程,其实这些解决办法在以往也是非常有用的,其实这个解决办法跟工程设置的编译版本和最小版本有关,大家都知道,在不同的版本上,程序有很多不同的效果和处理方式。今天我关注的不是在上面,而是接下来要说的4.0以后的解决重定向的方法,非常简单(我是基于4.0做得测试,到底这个方法支持到什么版本,我未研究)。
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
一言不合就贴了代码,对的,就是这么简单,就是直接返回false,就可以解决重定向问题。
网上搜索了下这里返回false和返回true的原因,其实我也看的云里雾里,没理解透彻
shouldOverrideUrlLoading :这个方法的返回值
return true 表示当前url即使是重定向url也不会再执行(除了在return true之前使用webview.loadUrl(url)除外,因为这个会重新加载)
return false 表示由系统执行url,直到不再执行此方法,即加载完重定向的ur(即具体的url,不再有重定向)。
先弄出来,大家可以交流,看看对不同的api的效果是什么样子。
附带在一个论坛上看到一个网友的解释,我觉得也很有参考的价值,其实跟自己维护历史栈道理相同,不过它是通过httpcode来判断是否是重定向地址,以下是他说的:
来讲讲WebView加载重定向页面会遇到问题。
1.如果需要获取webview访问的url地址,那么加载重定向页面时会显示两次
2.如果WebView在加载页面的过程中,有加载重定向页面,那么在Android2.3版本中会遇到无法回退的问题,但是4.0以上系统不会。例如,用户在点击回退时,webview会执行goBack()方法,2.3系统不能正常回退,而4.0能正常回退,可以解释为4.0系统的webview对重定向做了处理,他会把重定向的两个页面看做是一个页面,所以webview成功回退了,但是2.3系统的webview会先回退到重定向页面(非真正的目的页面),回退之后会执行loadUrl(url)方法,而这是因为url是个重定向url,所以会跳转到真正的目标页面,so,经过两次加载,页面还是回到goBack()之前的页面!
问题2的解决方案:
从重定向的概念可知,当访问重定向url时服务器会返回301状态码,那么可以根据此特殊的状态码来把重定向页面排除在历史访问记录队列里。
具体思路为:
(1)自定义一个历史url访问队列——MyWebBackForwardList
(2)在webview每次loadUrl(url)之前先用HttpUrlConnection对象的getResponseCode()方法来获取状态码,如果==301,不加入队列中,否者加入。
(3)重写webview的canGoBack()和goBack()方法
不再使用webview的WebBackForwardList对象来取历史url,而是使用自定义的MyWebBackForwardList来取出回退的url
网友评论