您的位置:首页 > 移动开发

Android webview 缓存总结

2015-08-16 21:13 316 查看
最近做的项目中,遇到了解决webview加载网络留下的缓存的问题。大致总结一下:

摘要:webview的缓存分为页面缓存和数据缓存,这些都可以通过webview相关的api来设置,如webviewSetting就有相关的api来设置其缓存机制。

webview在加载网页时,会在/data/data/you_package_name/cache/ 和 /data/data/you_package_name/database/ 这两个文件夹下建立相应的缓存文件。

注意:这两个文件夹是整个应用存储缓存的地址,并不是为了webview缓存而建立。

如图,我没启动webview加载网页前,这两个文件夹就已经存在了,这两个文件跟页面缓存有关

但是因为没有启动webview加载网页,所有没有webview对应的缓存文件存在:

1、页面缓存

页面缓存是指在加载html页面的过程中的html,js,css等页面内容和资源数据,页面缓存是由浏览器行为而产生(这点我也验证了下,不管你在android代码中是否设置了mWebSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);页面缓存都会产生,),网页开发者可以通过配置HTTP响应头来影响浏览器的行为,进而间接的影响到

页面缓存数据。如:www.taobao.com的网页中设置了cache-control为no-cache,这样就能影响到webview的页面缓存。

页面缓存路径:

前面提到了,android中没有api来设置是否进行页面缓存,也没有设置路径的api,这是浏览器的默认行为。页面缓存有两个路径,都在/data/data/package_name/下,一个是/data/data/you_package_name/cache/
和 /data/data/you_package_name/database/。

/data/data/you_package_name/cache/

/data/data/you_package_name/database/

我们请求的Url记录是保存在databases下的db文件里。而url的内容保存在cache下的XXXwebviewCacheXXX文件夹下的文件里。也就是说,

网页的索引方在databases下的db文件里,而它们的文件存在/data/data/you_package_name/cache/XXXwebviewCacheXXX里面,文件夹的

名字在2.x和4.x上有所不同,但是都包含webviewCache。

缓存模式

页面缓存的模式有五种。注意,不管是否设置了页面缓存,页面缓存默认都存在(这点前面也提到过),

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。

清除缓存
clearCache(boolean)

CacheManager.clear高版本中需要调用隐藏API。

控制大小
无系统API支持。

可选方式:定时统计缓存大小、按时间顺序删除缓存

2、数据缓存。

数据缓存可分为AppCacheDOM
Storage
(常说的web Storage),他们都是由开发者的直接行为而产生。所有的缓存数据都由开发者直接

完全掌控

AppCache

它我们能有选择的缓存web浏览器中的所有的东西,包括图片,页面,脚本,css等。

在Android上需要手动开发AppCache缓存,Android提供的api有setAppCacheEnable,setAppCachePath,setAppCacheMaxSize。

Android中的webkit使用一个db文件来保存AppCache缓存的数据。(you_package_path/ApplicationCache.db)

实例:

mWebSetting.setAppCacheEnabled(true);
//设置webview数据缓存中的AppCache

mWebSetting.setAppCacheMaxSize(1024*1024*50);

String dir = mContext.getDir("cache",
Context.MODE_PRIVATE).getPath();

mWebSetting.setAppCachePath(dir);

注意,是否设置了setAppCacheEnable为true或者false,appCache创建缓存目录文件没关系,设置为false时,只要你设置了setAppCachePath

,同样可以创建缓存目录。这里特别需要注意的是,尽量使用String dir = mContext.getDir("cache", Context.MODE_PRIVATE).getPath();mWebSetting.setAppCachePath(dir);来设置缓存目录,这样不会出问题。而我自己mWebSetting.setAppCachePath(Utils.getCacheDirPath(mContext) + "/appCache/ApplicationCache.db");创建缓存目录时,总是不成功。

当你设置setAppCacheEnabled为false时,缓存文件的大小为0罢了,如上图。

清除缓存

在清除AppCache时,需要你手动在代码中找到设置AppCache的路径,并把它删掉。

DOM Storage和database Storage

设置Storage时,可以使用setDatabaseEnabled和setDomStorageEnabled。设置缓存路径都使用setDatabasePath(path)。

如何需要存储一些键值对的数据,DOM Storage是很好的选择。Dom Storage分为会话级和本地(session storage 和local storage),

分别用于会话级的存储和本地存储(会话完成消除,本地存储需要手动删除)。

mWebSetting.setDatabaseEnabled(true); //设置webview数据缓存中的

mWebSetting.setDomStorageEnabled(true);

String dir2 = mContext.getDir("database", Context.MODE_PRIVATE).getPath();

mWebSetting.setDatabasePath(dir2);

如图,设置了database和domstorage的的缓存的目录和文件

清除缓存

在清除dom Storage时,需要你手动在代码中找到设置dom Storage的路径,并把它删掉。

另外,在Android中清除缓存时,如果需要清除Local Storage的话,仅仅删除Local Storage的本地存储文件是不够的,内存里面有缓存数据。

如果再次进入页面,Local Storage中的缓存数据同样存在。需要杀死程序运行的当前进程再重新启动才可以。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息