除了使用Bitmap.recycle()的建議(這是不是適用於所有情況,它是在頸部疼痛被問:「我還需要此位圖」),我一直用這個技術,它的作品真的罰款:
// 1. create a cache map
private WeakHashMap<String, SoftReference<Bitmap>> mCache;
正如你所看到的,它的WeakReference
s的一個SoftReference
爲值的哈希映射。
//2. when you need a bitmap, ask for it:
public Bitmap get(String key){
if(key == null){
return null;
}
if(mCache.containsKey(key)){
SoftReference<Bitmap> reference = mCache.get(key);
Bitmap bitmap = reference.get();
if(bitmap != null){
return bitmap;
}
return decodeFile(key);
}
// the key does not exists so it could be that the
// file is not downloaded or decoded yet...
File file = new File(Environment.getExternalStorageDirectory(), key);
if(file.exists()){
return decodeFile(key);
} else{
throw new RuntimeException("Boooom!");
}
}
這將檢查緩存映射。如果文件已經被解碼,它將被返回;否則它將被解碼和緩存。
//3. the decode file will look like this in your case
private Bitmap decodeFile(String key) {
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"//Pics/"+key);
mCache.put(key, new SoftReference<Bitmap>(bitmap));
return bitmap;
}
使用軟引用是很好的,因爲您將位圖從內存中移除到操作系統的責任。
畢竟這些年來,你還在使用這種方法嗎?如果是這樣,請告訴您爲什麼在已經有WeakHashMap的情況下仍然使用SoftReference? – frankish 2015-02-17 12:29:34