Rexxar Android 系列学习(6) 缓存机制
2017-07-19 本文已影响114人
無名小子的杂货铺
Rexxar 缓存部分功能也是非常重要,作为数据读取的基础。首先这里也使用了开源库 ByteArrayOutputStream 相关。比较完备的提供关了一些读取扩展,能够有效的增加正确率。这部分有兴趣的可以单独看,就是输入输出流操作。
Cache
Cache 分为两部分:本地预装、本地 file 缓存。
看结构就很清楚:
ICache :提供了一个统一的缓存接口,主要根据 url 查找和删除缓存;
CacheEntry:缓存本地 model;
CacheHelper:缓存统一管理;
AssetCache:本地预装 assets 文件缓存;
HtmlFileCache:Html 缓存本地 file;
InternalCache:默认缓存池,js,css,png等资源会用默认缓存池来存储,是有大小限制的;
AssetCache 会在程序初始化的时候被加载。
几个操作
1、提供缓存开关
2、url 转成唯一对应的 key 值
public static String hash(String source) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] md5Bytes = messageDigest.digest(source.getBytes("UTF-8"));
return ByteString.of(md5Bytes).hex();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return source;
}
3、支持其他类型缓存的扩展,实现 ICache 即可。
Html 缓存
这里简单介绍下 html 缓存查找相关,使用循环遍历查找 assets、本地 file,最终都会返回 CacheEntry。
/**
* 查找html缓存
*
* @param url
* @return
*/
public CacheEntry findHtmlCache(String url) {
Log.i(TAG,"findHtmlCache url1:" + url);
if (TextUtils.isEmpty(url)) {
return null;
}
url = Uri.parse(url).buildUpon().clearQuery().build().toString();
if (!checkUrl(url)) {
return null;
}
CacheEntry result;
// 遍历外部缓存
for (ICache cache : mCaches) {
result = cache.findCache(url);
if (null != result && result.isValid()) {
Log.i(TAG,"findHtmlCache result1:" + result);
return result;
}
}
// 遍历内部缓存
result = mInternalHtmlCache.findCache(url);
if (null != result) {
Log.i(TAG,"findHtmlCache result2:" + result);
return result;
}
Log.i(TAG,"findHtmlCache result3:" + result);
return result;
}
Rexxar Android 系列学习其他文章
Rexxar Android 系列学习(1) 项目结构
Rexxar Android 系列学习(2) 路由协议
Rexxar Android 系列学习(3) Native 和 web 交互
Rexxar Android 系列学习(4) 错误处理
Rexxar Android 系列学习(5) 过滤拦截
Rexxar Android 系列学习(6) 缓存机制