前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >玩转 WebView ,突破系统限制,让缓存更简单,更灵活

玩转 WebView ,突破系统限制,让缓存更简单,更灵活

作者头像
非著名程序员
发布2018-02-09 16:20:08
2.3K0
发布2018-02-09 16:20:08
举报
文章被收录于专栏:非著名程序员非著名程序员

今天给大家推荐一个不错的开源库,非常的不错,可以突破系统限制,让缓存更简单,更灵活。它就是:CacheWebView。

CacheWebView

CacheWebView 是 Android WebView 缓存的自定义实现,通过拦截静态资源进行内存 (LRU) 和磁盘 (LRU)2 级缓存实现缓存。突破系统 WebView 缓存的空间限制,让缓存更简单、更快、更灵活。让网站离线也能正常访问。

流程图

使用方式

引入库

代码语言:javascript
复制
compile 'ren.yale.android:cachewebviewlib:1.2.3'

修改代码

代码里将WebView改为CacheWebView或者 layout xml 里修改WebViewren.yale.android.cachewebviewlib.CacheWebView

完毕,其他都不用修改。CacheWebView 默认会有内部 cache200M 磁盘缓存空间,20M 内存缓存空间。同时缓存模式是 http 默认的缓存模式

进阶

  • 修改缓存路径和大小, 最好在 Application 中初始化,初始化没有耗时操作
代码语言:javascript
复制
File cacheFile = new File(this.getCacheDir(),"cache_path_name");

CacheWebView.getCacheConfig().init(this,cacheFile.getAbsolutePath(),1024*1024*100,1024*1024*10)
.enableDebug(true);//100M 磁盘缓存空间,10M 内存缓存空间
  • 预加载,为了访问更快,可以将常用的页面预加载
代码语言:javascript
复制
CacheWebView.cacheWebView(this).loadUrl(URL);//要放在UI线程

或者

代码语言:javascript
复制
CacheWebView.servicePreload(this,URL);//通过启动Service来预加载,不影响UI线程
  • 强制缓存,默认是普通缓存,和 http 缓存模式一样。setCacheStrategy(WebViewCache.CacheStrategy.FORCE), 这样对于静态资源直接走缓存,不需要和服务器沟通走 304 缓存,这样会更快;如果静态资源要更新, 请让 web 前端同学修改静态资源链接,如给链接加 md5 值,或者加版本等等方式;
代码语言:javascript
复制
CacheWebView webview;
webview.setCacheStrategy(WebViewCache.CacheStrategy.FORCE);
  • 静态资源后缀映射 默认磁盘缓存静态资源后缀有:html,htm,js,ico,css,png,jpg,jpeg,gif,bmp,ttf,woff,woff2,otf,eot,svg,xml,swf,txt,text,conf 可以添加删除, addExtension,removeExtension 默认内存缓存静态资源后缀有:html,htm,js,css,xml,txt,text,conf 可以添加删除, addRamExtension,removeRamExtension
代码语言:javascript
复制
webview.getWebViewCache().getStaticRes().addExtension("swf").removeExtension("svg")
                .addRamExtension("png").removeRamExtension("html");
  • 设置缓存拦截器,可以针对每一个 url 是否拦截缓存
代码语言:javascript
复制
webview.setCacheInterceptor(new CacheInterceptor() {
            public boolean canCache(String url) {
                return true;
            }
 });
  • 删除缓存
代码语言:javascript
复制
CacheWebView webview;
webview.clearCache();
  • 添加 header
代码语言:javascript
复制
CacheWebView webview;
webview.loadUrl(URL,getHeaderMap(URL));
代码语言:javascript
复制
@Override
 public boolean shouldOverrideUrlLoading(WebView view, String url) {
     CacheWebView v = (CacheWebView) view;
     v.loadUrl(url,getHeaderMap(url));
     return true;
 }
  • 阻塞图片加载,让页面更快加载 默认没有阻塞图片加载,setBlockNetworkImage(true) 后。在页面 onPageStarted 时阻塞图片加载,onPageFinished 时打开图片加载
代码语言:javascript
复制
CacheWebView webview;
webview.setBlockNetworkImage(true);
  • 是否使用自定义缓存,默认是自定义缓存, 如果是 false,那就和正常的 WebView 使用一样
代码语言:javascript
复制
CacheWebView webview;
webview.setEnableCache(true);
  • 设置 User-Agent
代码语言:javascript
复制
CacheWebView webview;
webview.setUserAgent("Android");
  • 获取缓存文件
代码语言:javascript
复制
CacheStatus cacheStatus =  webview.getWebViewCache().getCacheFile(URL);
 if (cacheStatus.isExist()){
    File file = cacheStatus.getCacheFile();
    String extension = cacheStatus.getExtension();
 }
  • destroy
代码语言:javascript
复制
CacheWebView webview;
webview.destroy();
  • 页面乱码;默认判断页面编码的 buffer 大小是 500,如果有些中文网站乱码,可以把这个 size 设置大些
代码语言:javascript
复制
CacheWebView.getCacheConfig().setEncodeBufferSize(1024);
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 非著名程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CacheWebView
  • 流程图
  • 使用方式
    • 引入库
      • 修改代码
      • 进阶
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档