码迷,mamicode.com
首页 > 移动开发 > 详细

android 读取WebView缓存及清理WebView缓存

时间:2016-08-12 18:26:48      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:

WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即appcache)。

一、网页缓存
1、缓存构成
/data/data/package_name/cache/
/data/data/package_name/database/webview.db
/data/data/package_name/database/webviewCache.db

在项目中经常会使用到WebView控件,当加载html页面时,会在/data/data/应用package目录下生成database与cache两个文件夹如下图如示:

技术分享

请求的url记录是保存在webviewCache.db,而url的内容是保存在webviewCache文件夹下.

所以清理的时候只需要把这几个文件夹下的文件删除就行了

//真机测试我用的是魅蓝5.1的系统,/data/data/应用package目录下找不到database文件用下面两句清理webview网页缓存的时候.但是每次执行都报false,

context.deleteDatabase("webview.db");    
 context.deleteDatabase("webviewCache.db");

2、缓存模式(5种)

LOAD_CACHE_ONLY:  不使用网络,只读取本地缓存数据

LOAD_DEFAULT:  根据cache-control决定是否从网络上取数据。

LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式

LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.

LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
如:www.taobao.com的cache-control为no-cache,在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面;在LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取。
www.360.com.cn的cache-control为max-age=60,在两种模式下都使用本地缓存数据。

总结:根据以上两种模式,建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK。


而databases中的webviewCache.db 中放的就是图片地址和图片名字对应等信息 的表~ 导出后也可用SQLite Database Browser 等工具查看

 

1.优先缓存 

好了,这里你是不是想问:既然这些图片已经存在手机缓存里面了,为什么Webview不能再把它显示出来呢?

这里我们需要设置下:

WebSettings webSettings= webView.getSettings();

webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

//WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 默认不使用缓存!

LOAD_CACHE_ELSE_NETWORK的意思是:

 

Use cache if content is there, even if expired (eg, history nav) If it is not in the cache, load from network. Use withsetCacheMode(int).

如果内容已经存在cache 则使用cache,即使是过去的历史记录。如果cache中不存在,从网络中获取!

 

所以加上这句,不仅可以使用cache离线显示用户浏览过的内容,还可以在有网络的情况下优先调用缓存,为用户减少流量!~


2.缓存管理:

(1)clearCacheFolder(Activity.getCacheDir(), System.currentTimeMillis());//删除此时之前的缓存.

 

在退出程序之前执行下面的代码:

File file = CacheManager.getCacheFileBaseDir();    
  if (file != null && file.exists() && file.isDirectory()) { for (File item : file.listFiles()) { item.delete();    
  }    
  file.delete();    
  }    
  context.deleteDatabase("webview.db");    
  context.deleteDatabase("webviewCache.db");


更多实例请参考:http://www.android100.org/html/201409/07/63446.html

二、H5缓存

这个我还没有涉猎请参考:http://87426628.blog.163.com/blog/static/6069361820139183417725/

参考:

http://androiddada.iteye.com/blog/1280946

如果离线加载出现乱码 可参考: http://androidturing.iteye.com/blog/1280656

 

http://androiddada.iteye.com/

2.缓存管理:

(1)clearCacheFolder(Activity.getCacheDir(), System.currentTimeMillis());//删除此时之前的缓存.

 

android 读取WebView缓存及清理WebView缓存

标签:

原文地址:http://blog.csdn.net/wei_chong_chong/article/details/52189011

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!