Android WebView由于重定向造成的goBack()无效的问题解决

最近项目中WebView返回时需要一级一级返回,就使用到WebView.goBack()方法。可当加载重定向的URL,出现了不能正常退出WebView的问题。

问题描述

比如,加载此重定向URL:http://news.cctv.com/m/la/index.shtml?id=ARTIPelLhipU21KF1nsbxpA7180816

在设置WebView的setWebViewClient()时,重写了shouldOverrideUrlLoading()、onReceivedSslError()、onPageFinished()等方法,如下:

        //如果不设置WebViewClient,请求会跳转系统浏览器
        webView.setWebViewClient(new WebViewClient(){

            //覆写shouldOverrideUrlLoading实现内部显示网页
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {

                view.loadUrl(url);
                return true;
            }

            //重写此方法可以让webview处理https请求
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                LogUtil.d(TAG,"onReceivedSslError"+error.toString());
                handler.proceed();// 接受所有网站的证书;2.handler.cancel()-Android默认的处理方式;3.handleMessage(Message msg); // 进行其他处理
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                LogUtil.d(TAG,"onPageFinished url = "+url);

                ...

                super.onPageFinished(view, url);
            }
        });

返回时,

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK) {
            if(webView.canGoBack()){
                //当WebView不是处于第一页面时,返回上一个页面
                webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
                webView.goBack();
                return true;
            }else {
                //当WebView处于第一页面时,直接退出
                finish();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

当加载重定向的URL时,点击物理返回按键时webview.canGoBack()判断为true,即就调用webview.goBack()方法,这时shouldOverrideUrlLoading()方法中return true,表示是程序自己来处理goBack()后的URL加载,当加载重定向URL会变成一个死循环,不会正常退出WebView。

 

解决方法

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {

//                view.loadUrl(url);
//                return true;
                LogUtil.d(TAG,"shouldOverrideUrlLoading");
                return false;
            }

shouldOverrideUrlLoading()方法中return false,表示就会交给WebView来进行处理,WebView内部识别出重定向URL并进行finish操作。

 

最终,问题得以解决。

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值