安卓WebView问题总汇(持续更新)

WebView在现在的项目中使用的频率应该还是非常高的。如果有对webView了解不太多的可以去看我以前写的一个博客,里面有详细的WebView介绍,点击进入

我个人做的项目里面有很多H5界面,并且跟H5交互,在做项目过程中出现了很多问题,下面来总结一下自己遇到的问题:

Android 7.0 WebView加载https出现空白页:


需要重写WebViewClient的onReceivedSslError方法

 @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            /**
             * https  请求 webview 有 证书校验
             *  为了适配安卓7.0
             *  onReceivedSslError 过滤掉 部分错误
             */

            if (error.getPrimaryError() == SslError.SSL_DATE_INVALID
                    || error.getPrimaryError() == SslError.SSL_EXPIRED
                    || error.getPrimaryError() == SslError.SSL_INVALID
                    || error.getPrimaryError() == SslError.SSL_UNTRUSTED) {
                handler.proceed();
            } else {
                handler.cancel();
            }

            super.onReceivedSslError(view, handler, error);
        }
用户丢失,登录不通过验证,Cookie丢失问题:

请点击这里进入

怎么用自带的浏览器去打开网页:

mWebView.setWebViewClient(new WebViewClient(){
//给WebView设置自己的WebViewVlient  然后重写shouldOverrideUrlLoading
//并且返回值设置为true就可以了
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
          view.loadUrl(url);
      return true;
      }
  });
关于缓存方面的:

缓存模式

LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。 

结合使用(离线加载):
if (NetStatusUtil.isConnected(getApplicationContext())) {
    webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//根据cache-control决定是否从网络上取数据。
} else {
    webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//没网,则从本地获取,即离线加载
}

webSettings.setDomStorageEnabled(true); // 开启 DOM storage API 功能
webSettings.setDatabaseEnabled(true);   //开启 database storage API 功能
webSettings.setAppCacheEnabled(true);//开启 Application Caches 功能

String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME;
webSettings.setAppCachePath(cacheDirPath); //设置  Application Caches 缓存目录

注意: 每个 Application 只调用一次 WebSettings.setAppCachePath(),WebSettings.setAppCacheMaxSize()

js调用原生方法:

WebSettings webSettings = mWebView .getSettings(); 
  webSettings.setJavaScriptEnabled(true); 

  mWebView.addJavascriptInterface(new InsertObj(), "jsObj");

//上面这是前提!!!
//然后实现上面的类,这个类提供了四个方法,注释的非常清楚。
class InsertObj extends Object {
    //给html提供的方法,js中可以通过:var str = window.jsObj.HtmlcallJava(); 获取到
    @JavascriptInterface
    public String HtmlcallJava() {
        return "Html call Java";
    }} 



关于自定义加载框以及标题的问题:

WebChromeClient mWebChromeClient = new WebChromeClient() {
    //获得网页的加载进度,显示在右上角的TextView控件中
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        if (newProgress < 100) {
            String progress = newProgress + "%";
        } else {
        }
    }
 //获取Web页中的title用来设置自己界面中的title
    //当加载出错的时候,比如无网络,这时onReceiveTitle中获取的标题为 找不到该网页,
    //因此建议当触发onReceiveError时,不要使用获取到的title
    @Override
    public void onReceivedTitle(WebView view, String title) {
        MainActivity.this.setTitle(title);
    }
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值