Android 解决WebView重定向

来源:互联网 发布:js获取选择文件的路径 编辑:程序博客网 时间:2024/05/27 06:13

调用webviewd的goBack(),goForward()有时候出现的并不是我们想象中的页面,可能连续调了两次goBack才能回到原来的页面。有时候url没错,页面莫名其妙的error。这些往往都是由于网页自身重定向引发的。
拿携程的网址举例子http://m.ctrip.com/
通过对webView开启过的页面进行打印

        webView.setWebViewClient(new WebViewClient(){            @Override            public void onPageStarted(WebView view, String url, Bitmap favicon) {                 Log.e("kid","onPageStarted="+url);            }        });

打印结果
可以看到,onPageStarted不止调用了一次。这也就是我们goBack的时候,要调用几次才能退回的原因了。
我们还看到url出现ctrip://开头的,不知道什么鬼的东东,这个是携程自己的协议,这跟我们自己公司做H5页面,自己定义业务逻辑是一样的(对于android)。同样一段,复制黏贴到ios的浏览器上,发现这一段协议可以弹出一个系统弹框,询问是否要跳转到携程App。所以也有可能是专门给ios做的重定向。这里我们就忽略过了。我们只是不希望这个网站的重定向,影响到我们的正常浏览,比如时不时来个error页面。
解决方法:
webView有一个拦截网络请求的方法,调用在onPageStart之前——shouldOverrideUrlLoading,返回true,则拦截,false则不拦截。我们要做的是,在前进,返回逻辑的时候,讲业务逻辑交给网页本身处理,不拦截它的操作,网页自身会判断你goBack要回到哪里。但要拦截网页自定义的协议,不然进入start Load 这个url之后,比如进入error页面。

        webView.setWebViewClient(new WebViewClient(){            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                if(!(url.startsWith("http")||url.startsWith("https"))){                    return true;                }                return false;            }        });
阅读全文
0 0
原创粉丝点击