Android:图片缓存策略和内存缓存大小 [英] Android: Image cache strategy and memory cache size
问题描述
我正在实现一个图像缓存系统来缓存下载的图像.
I'm implementing an image cache system for caching downloaded image.
我的策略基于两级缓存: 内存级别和磁盘级别.
My strategy is based upon two-level cache: Memory-level and disk-level.
My downloaded images are put into an hashmap and the Bitmap objet is
wrapped inside a SoftRererence object. Also every image is saved
permanently to the disk.
If a requested image is not found into the
Hashmap<String,SoftReference<Bitmap>>
it will be searched on the disk,
readed, and then pushed back into the hashmap. Otherwise the image will be
downloaded from the network.
Since I store the images into the phisical device momery, I have added a check for preserve the device space and stay under a 1M of occupied space:
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()+"}");
}
}
}
此方法有时在磁盘写入后被调用:
This method is called sometime afte a disk writing:
Random r = new Random();
int ra = r.nextInt(10);
if (ra % 2 == 0){
checkCacheUsage();
}
我要添加的内容是对HashMap大小进行相同的检查,以防止其增长太多.像这样:
What I'd like to add is the same check on the HashMap size to prevent it will grow too much. Something like this:
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已经足够了"
My question is: What could be a right MAX_MEMORY_SIZE value? Also, Is it a good approach? A good answer also could be: "Don't do it! SoftReference is already enough"
推荐答案
不要这样做! SoftReference已经足够了! 实际上,SoftReference旨在完全满足您的需求. 有时,SoftReference无法满足您的需求.然后,您就可以摆脱SoftReference并编写自己的内存管理逻辑.但是就您使用SoftReference而言,您不必担心内存消耗,SoftReference会为您做到这一点.
Don't do it! SoftReference is already enough! Actually SoftReference is designed to do exactly what you need. Sometimes SoftReference doesn't do what you need. Then you just get rid of SoftReference and write your own memory management logic. But as far as you use SoftReference you should not be worried about memory consumption, SoftReference does it for you.
这篇关于Android:图片缓存策略和内存缓存大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!