Ленивая загрузка Drawable терпит неудачу в SoftReferences - PullRequest
2 голосов
/ 29 сентября 2010

У меня есть список с 100 различными изображениями.Мой кеш выглядит следующим образом:

public class ImageCache {
    HashMap<String, SoftReference<Drawable>> myCache;
    ....
    ....
    public void putImage(String key, Drawable d) {
        myCache.put(key, new SoftReference<Drawable>(d));
    }

    public Drawable getImage(String key) {
        Drawable d;
        SoftReference<Drawable> ref = myCache.get(key);

        if(ref != null) {
            //Get drawable from reference
            //Assign drawable to d
        } else {
            //Retrieve image from source and assign to d
            //Put it into the HashMap once again
        }
        return d;
    }
}

У меня есть собственный адаптер, в котором я устанавливаю значок ImageView, извлекая из моего кеша рисование.Программа, большинство изображений из ListView исчезает через некоторое время, а некоторые из них даже не там, на первом месте.Вместо этого я заменил HashMap жесткой ссылкой.Мол,

HashMap<String, Drawable> myCache

И этот кусок кода работает.Я хочу оптимизировать мой код.Любые предложения.

Ответы [ 2 ]

4 голосов
/ 29 сентября 2010

Этот код выглядит неработающим:

    if(ref != null) {
        //Get drawable from reference
        //Assign drawable to d
    } else {
        //Retrieve image from source and assign to d
        //Put it into the HashMap once again
    }

Если мягкая ссылка была удалена, вы окажетесь в первом состоянии, не обнаружите его и не перезагрузите изображение.Вам нужно сделать что-то похожее на это:

    Drawable d = ref != null ? ref.get() : null;
    if (d == null) {
        //Retrieve image from source and assign to d
        //Put it into the HashMap once again
    }
    //Get drawable from reference
    //Assign drawable to d

Платформа широко использует слабые ссылки для кэшей рисованных объектов, загружаемых из ресурсов и других вещей, поэтому, если вы получаете ресурсы из ресурсов, вы можете просто позволить этому позаботитьсяэто для тебя.

2 голосов
/ 29 сентября 2010

Существует известная проблема с SoftReference в Android.Они могут быть освобождены рано, на них нельзя полагаться.
http://groups.google.com/group/android-developers/browse_thread/thread/ebabb0dadf38acc1
Чтобы решить эту проблему, мне пришлось написать собственную реализацию SoftReference.

...