Помимо использования Bitmap.recycle () в соответствии с предложением (что не подходит для всех ситуаций, и боль в шее спрашивать: « мне все еще нужен этот растр? * "), Я всегда использую эту технику, которая работает очень хорошо:
// 1. create a cache map
private WeakHashMap<String, SoftReference<Bitmap>> mCache;
Как видите, это хеш-карта WeakReference
с со значениями 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;
}
Работать с мягкими ссылками приятно, потому что вы переносите ответственность за удаление растровых изображений из памяти на ОС.