一、缓存策略
参考《android开发艺术探索》
一般先从内存取,内存没有就从存储设备取,存储设备没有再从网络下载。目前常用缓存算法是LRU。
1.内存缓存LruCache
<pre>
int maxMemory = (int)(Runtime.getRuntime().maxMemory/1024);
int cacheSize = maxMemory/8;
mMemoryCache = new LruCache<String,Bitmap>(cahceSize){
protected int sizeof(Sting key,Bitmap bitmap){
return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
}
}
mMemoryCache.get(key);
mMemoryCache.put(key,bitmap);
</pre>
2.磁盘缓存DiskLruCache
mDiskLruCache = DiskLruCache.open(diskCacheDir,1,1,DISK_CAHCE_SIZE);
第一个参数表示缓存在磁盘上的存储路径,第二个是应用版本号,当版本号变化时会清空缓存,第三个参数表示单个节点所对应的数据数,第四个参数表示缓存总大小,超出设定值会自动清除部分缓存。
缓存的添加操作通过Editor完成,Editor表示一个缓存对象的编辑对象。首先获取图片url对应的key,然后根据key获取Editor,如果这个缓存正在被编辑,那么edit()返回null,即不允许同时编辑一个缓存对象。之所以要把url转化为key, 是因为url中可能有特殊字符,这将影响url在android中使用。
<pre>
String key = hashKeyFormUrl(url);
DiskLruCache.Editor editor = mDiskLruCache.edit(key);
if(editor !=null){
//DISK_CACHE_INDEX=0因为设置了一个节点只能有一个数据
OutputStream outputStream = editor.newOutputStream(DISK_CACHE_INDEX);
}
</pre>
读取完outputStream后,可以通过commit提交写入操作,或者abort回退。