У меня есть растровый кеш в моем приложении для Android, на котором битмапы ссылаются через SoftReference. Однако растровые изображения чередуются слишком рано. В кэше может быть 20 битмапов макс, если я загружаю больше, GC начинает игнорировать SoftReferences. Без SoftReferences у меня может быть около 110 бит-карт в кеше. Разве SoftReference не должен иметь значение null перед тем, как произойдет OutOfMemoryError?
Нет, импликация работает наоборот:
Гарантируется, что среда выполнения Java аннулирует SoftReferences, если она есть, перед тем, как выбросить OutOfMemoryError. Однако это не гарантирует, что SoftReference будет сведено к нулю только при этом условии.
В моем случае, Hashmap (bitmap cache) получил нули, если я вернусь из другого Activity. Итак, я исправил свой код, как ниже, псевдокод.
void displayImageFunction() {
if(mImageCacheMap.containsKey(key)) {
Bitmap bitmapToShow = mImageCacheMap.get(url).get();
if(bitmapToShow != null) {
//> Image was cached well
//> Set "bitmapToShow" to UI
return;
}
}
//> Read from file DB(or Web) and...
Bitmap bmp = getBitmap(imageToLoad.url);
//> put it to Hashmap again...
mImageCacheMap.put(key, new SoftReference<Bitmap>(bmp));
//> Set "bmp" to UI
}
Я думаю, что мы должны предварительно предварять нули. Потому что мы не можем знать, когда GC собирает мусор.:)