我的Android应用程序中有一个位图缓存,其位图通过SoftReference引用。然而,位图过早被淘汰。缓存中最多可以有20个位图,如果我加载更多,GC开始使SoftReferences为空。没有SoftReferences,我可以在缓存中有大约110位图。在OutOfMemoryError发生之前,SoftReference不应该为null吗?
答案 0 :(得分:5)
不,这种暗示相反:
在抛出OutOfMemoryError之前,保证Java运行时将使SoftReferences(如果有)无效。但是,它并不能保证只有在这种情况下才能使SoftReference无效。
答案 1 :(得分:0)
在我的情况下,如果我从另一个Activity返回,Hashmap(位图缓存)获取空值。 所以,我修改了我的代码,如下面的伪代码。
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何时收集垃圾。 :)