玩转 WebView ,突破系统限制,让缓存更简单,更灵活
时间:2022-04-28
本文章向大家介绍玩转 WebView ,突破系统限制,让缓存更简单,更灵活,主要内容包括CacheWebView、流程图、使用方式、修改代码、进阶、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
今天给大家推荐一个不错的开源库,非常的不错,可以突破系统限制,让缓存更简单,更灵活。它就是:CacheWebView。
CacheWebView
CacheWebView 是 Android WebView 缓存的自定义实现,通过拦截静态资源进行内存 (LRU) 和磁盘 (LRU)2 级缓存实现缓存。突破系统 WebView 缓存的空间限制,让缓存更简单、更快、更灵活。让网站离线也能正常访问。
流程图
使用方式
引入库
compile 'ren.yale.android:cachewebviewlib:1.2.3'
修改代码
代码里将WebView
改为CacheWebView
或者 layout xml 里修改WebView
为ren.yale.android.cachewebviewlib.CacheWebView
完毕,其他都不用修改。CacheWebView 默认会有内部 cache200M 磁盘缓存空间,20M 内存缓存空间。同时缓存模式是 http 默认的缓存模式
进阶
- 修改缓存路径和大小, 最好在 Application 中初始化,初始化没有耗时操作
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 内存缓存空间
- 预加载,为了访问更快,可以将常用的页面预加载
CacheWebView.cacheWebView(this).loadUrl(URL);//要放在UI线程
或者
CacheWebView.servicePreload(this,URL);//通过启动Service来预加载,不影响UI线程
- 强制缓存,默认是普通缓存,和 http 缓存模式一样。setCacheStrategy(WebViewCache.CacheStrategy.FORCE), 这样对于静态资源直接走缓存,不需要和服务器沟通走 304 缓存,这样会更快;如果静态资源要更新, 请让 web 前端同学修改静态资源链接,如给链接加 md5 值,或者加版本等等方式;
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
webview.getWebViewCache().getStaticRes().addExtension("swf").removeExtension("svg")
.addRamExtension("png").removeRamExtension("html");
- 设置缓存拦截器,可以针对每一个 url 是否拦截缓存
webview.setCacheInterceptor(new CacheInterceptor() {
public boolean canCache(String url) {
return true;
}
});
- 删除缓存
CacheWebView webview;
webview.clearCache();
- 添加 header
CacheWebView webview;
webview.loadUrl(URL,getHeaderMap(URL));
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
CacheWebView v = (CacheWebView) view;
v.loadUrl(url,getHeaderMap(url));
return true;
}
- 阻塞图片加载,让页面更快加载 默认没有阻塞图片加载,setBlockNetworkImage(true) 后。在页面 onPageStarted 时阻塞图片加载,onPageFinished 时打开图片加载
CacheWebView webview;
webview.setBlockNetworkImage(true);
- 是否使用自定义缓存,默认是自定义缓存, 如果是 false,那就和正常的 WebView 使用一样
CacheWebView webview;
webview.setEnableCache(true);
- 设置 User-Agent
CacheWebView webview;
webview.setUserAgent("Android");
- 获取缓存文件
CacheStatus cacheStatus = webview.getWebViewCache().getCacheFile(URL);
if (cacheStatus.isExist()){
File file = cacheStatus.getCacheFile();
String extension = cacheStatus.getExtension();
}
- destroy
CacheWebView webview;
webview.destroy();
- 页面乱码;默认判断页面编码的 buffer 大小是 500,如果有些中文网站乱码,可以把这个 size 设置大些
CacheWebView.getCacheConfig().setEncodeBufferSize(1024);
- 用数据来聊聊国产电影~
- 如何买卖股票?不要慌,我有妙招!
- 2017.11.7解题报告
- TensorFlow从0到1 - 11 - 74行Python实现手写体数字识别
- 让priority_queue支持小根堆的几种方法
- 一招解决4道leetcode hard题,动态规划在字符串匹配问题中的应用
- 细数Python中的数据类型以及他们的方法
- 洛谷 P3807 【模板】卢卡斯定理
- 数据城堡参赛代码实战篇(六)---使用sklearn进行数据标准化及参数寻优
- 震惊!Vector两行代码求逆序对,六行代码过普通平衡树
- 数据城堡参赛代码实战篇(五)---使用sklearn解决分类问题
- 洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall
- [编程经验]Python生成器、迭代器与yield语句小结
- TensorFlow从0到1 - 12 - TensorFlow构建3层NN玩转MNIST
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言精算学:使用链梯法Chain Ladder和泊松定律模拟和预测未来赔款数据
- 微服务[学成在线] day19:分布式事务
- 微服务[学成在线] day20:项目部署与持续集成(DevOps)
- R语言中回归模型预测的不同类型置信区间应用比较分析
- R语言进阶之坐标轴和文本
- R语言广义线性模型(GLM)广义相加模型(GAM):多元平滑回归分析保险投资风险敞口
- 面试高频题:springBoot自动装配的原理你能说出来吗?
- R语言巨灾风险下再保险合同定价研究案例:广义线性模型和帕累托分布分析
- nodejs搭建mqtt服务器
- R语言中GLM(广义线性模型),非线性和异方差可视化分析
- 解决java的http请求库dongliu.requests请求结果中文乱码的问题
- 保姆级教程,手把手教你实现一个SpringBoot的starter
- 微服务[学成在线] day05:消息中间件 RabbitMQ
- 微服务[学成在线] day06:页面发布以及课程管理
- 微服务[学成在线] day07:课程管理开发