SoftReference обнуляется слишком рано

1

У меня есть растровый кеш в моем приложении для Android, на котором битмапы ссылаются через SoftReference. Однако растровые изображения чередуются слишком рано. В кэше может быть 20 битмапов макс, если я загружаю больше, GC начинает игнорировать SoftReferences. Без SoftReferences у меня может быть около 110 бит-карт в кеше. Разве SoftReference не должен иметь значение null перед тем, как произойдет OutOfMemoryError?

Теги:

2 ответа

5

Нет, импликация работает наоборот:

Гарантируется, что среда выполнения Java аннулирует SoftReferences, если она есть, перед тем, как выбросить OutOfMemoryError. Однако это не гарантирует, что SoftReference будет сведено к нулю только при этом условии.

  • 0
    Ага. И поведение SoftReference менялось от выпуска к выпуску в Android, поэтому неразумно предполагать, что текущее поведение сохранится. Ожидается, что в будущем выпуске Android появится настраиваемый класс утилит LruCache, который должен помочь в подобных ситуациях.
0

В моем случае, 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 собирает мусор.:)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню