我正在实现一个用于缓存下载图片的图像缓存系统。
我的策略基于两级缓存:内存级别和磁盘级别。
我的类与droidfu项目中使用的类非常相似。
我的下载图片被放入哈希表中,并且Bitmap对象被包装在SoftReference对象中。同时,每张图片也会永久保存到磁盘上。如果请求的图片没有在Hashmap<String,SoftReference<Bitmap>>
中找到,它将被从磁盘上读取并重新放回哈希表中。否则,该图片将从网络中下载。由于我将图片存储在物理设备内存中,因此我添加了一个检查来保留设备空间并保持占用空间不超过1M。
private void checkCacheUsage() {
long size = 0;
final File[] fileList = new File(mCacheDirPath).listFiles();
Arrays.sort(fileList, new Comparator<File>() {
public int compare(File f1, File f2) {
return Long.valueOf(f2.lastModified()).compareTo(
f1.lastModified());
}
});
for (File file : fileList) {
size += file.length();
if (size > MAX_DISK_CACHE_SIZE) {
file.delete();
Log.d(ImageCache.class.getSimpleName(),
"checkCacheUsage: Size exceeded " + size + "("
+ MAX_DISK_CACHE_SIZE + ") wiping older file {"+file.toString()+"}");
}
}
}
这个方法是在磁盘写入后的某个时间被调用:
Random r = new Random();
int ra = r.nextInt(10);
if (ra % 2 == 0){
checkCacheUsage();
}
我想要添加的是对HashMap大小的检查,以防它会增长得太多。类似这样的:
private synchronized void checkMemoryCacheUsage(){
long size = 0;
for (SoftReference<Bitmap> a : cache.values()) {
final Bitmap b = a.get();
if (b != null && ! b.isRecycled()){
size += b.getRowBytes() * b.getHeight();
}
if (size > MAX_MEMORY_SIZE){
//Remove some elements from the cache
}
}
Log.d(ImageCache.class.getSimpleName(),
"checkMemoryCacheUsage: " + size + " in memory");
}
我的问题是: 什么是正确的MAX_MEMORY_SIZE值? 此外,这种方法可行吗? 一个好的回答可能是:"不要这样做!SoftReference已经足够了"