SoftReference太早了

时间:2011-03-25 16:32:38

标签: android

我的Android应用程序中有一个位图缓存,其位图通过SoftReference引用。然而,位图过早被淘汰。缓存中最多可以有20个位图,如果我加载更多,GC开始使SoftReferences为空。没有SoftReferences,我可以在缓存中有大约110位图。在OutOfMemoryError发生之前,SoftReference不应该为null吗?

2 个答案:

答案 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何时收集垃圾。 :)