★ Android WebView 使用缓存以及清除缓存

公司项目采用的是JS 与原生webView交互的方式实现的,使用H5页面需要面对的问题就是缓存
如果不使用缓存,每次从网络获取如果当网络环境较差的时候,用户体验那是相当的不好,而使用缓存当H5做了修改,没有及时更新而依旧使用缓存,头大的该是Android开发者了。

先介绍一下WebView 几种缓存模式,知道的同学直接略过。

LOAD_CACHE_ONLY不使用网络,只读取本地缓存数据
LOAD_DEFAULT根据cache-control决定是否从网络上取数据
LOAD_CACHE_NORMALAPI level 17中已经废弃,从API level 11开始作用同LOAD_DEFAULT模式
LOAD_NO_CACHE不使用缓存,只从网络获取数据
LOAD_CACHE_ELSE_NETWORK只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。本地没有缓存时才从网络上获取

默认的时候 也就是WebView 不设置的模式是LOAD_DEFAULT。

1px缓存策略

app启动的时候加载一个1px的WebView,使其产生缓存方便下次进入 重新加载。

       webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);  //设置 缓存模式
        // 开启 DOM storage API 功能
        webView.getSettings().setDomStorageEnabled(true);
        //开启 database storage API 功能
        webView.getSettings().setDatabaseEnabled(true);
        String cacheDirPath = getCacheDir().getAbsolutePath();
        //设置数据库缓存路径
        webView.getSettings().setGeolocationDatabasePath(cacheDirPath);
        //设置  Application Caches 缓存目录
        webView.getSettings().setAppCachePath(cacheDirPath);
        //开启 Application Caches 功能
        webView.getSettings().setAppCacheEnabled(true);

有关WebView 使用封装的工具类

这里需要注意的是在最后我选择的缓存模式为LOAD_CACHE_ELSE_NETWORK

public class WebUtils {
    public static void initWebView(WebView webView, String cacheDirPath) {
        WebSettings webSettings = webView.getSettings();
        webSettings.setAllowFileAccessFromFileURLs(true);
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.supportMultipleWindows();
        webSettings.setAllowContentAccess(true);
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setSavePassword(true);
        webSettings.setSaveFormData(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.setLoadsImagesAutomatically(true);

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

        //设置数据库缓存路径
        webSettings.setDatabasePath(cacheDirPath);
        //设置  Application Caches 缓存目录
        webSettings.setAppCachePath(cacheDirPath);
        //开启 Application Caches 功能
        webSettings.setAppCacheEnabled(true);
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

    }
}

项目中的使用

   private void initWebView() {
   		//缓存路径
        String cacheDirPath = getFilesDir().getAbsolutePath();
        WebUtils.initWebView(webView, cacheDirPath);
        webView.setWebChromeClient(new MainWebChrome());
        webView.setWebViewClient(new MainWebClient());
        loadMainWeb();
        //与JS 交互设置的方法
        webView.addJavascriptInterface(new WebHost(), "android");

    }

通过url加载WebView

    public void loadMainWeb() {
        String url = HttpConstants.getInstances().getBaseWeb();
        webView.loadUrl(url);
    }

清除缓存的方法

可以通过推送 触发此方法,从而清除缓存重新加载页面。

                 clearCacheX();
                  //清除历史数据
                    webView.clearHistory();   
                 //清除 表单数据
                    webView.clearFormData();   
                // 重新加载页面
                    loadMainWeb();     

删除缓存文件

    private void clearCacheX() {
        File file = getCacheDir().getAbsoluteFile();//删除缓存
        deleteFile(file);
    }

    public void deleteFile(File file) {
        if (file.exists()) {
            if (file.isFile()) {
                file.delete();
            } else if (file.isDirectory()) {
                File files[] = file.listFiles();
                for (int i = 0; i < files.length; i++) {
                    deleteFile(files[i]);
                }
            }
            file.delete();
        }
    }

完美解决 使用 缓存以及清除缓存的问题! 目前项目中正在使用,亲测有效。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值