LRUCache не работает должным образом

В следующем примере показано, что использование LRUCache ограниченного размера приводит к ошибке OutOfMemory при выделении нового пространства за пределами LRUCache.

Свойства: Размер процесса 64 МБ ; 10 МБ Размер LRUCache ; Фрагменты размером 1 МБ, которые я помещаю в LRUCache в цикле.

После 57 (64 МБ - 7 МБ) попыток я получаю:

05-15 09:05:51.385: E/AndroidRuntime(11630): FATAL EXCEPTION: main
05-15 09:05:51.385: E/AndroidRuntime(11630): java.lang.OutOfMemoryError
05-15 09:05:51.385: E/AndroidRuntime(11630):    at com.example.testlrucachewithpathes.MyDataClass.<init>(MyDataClass.java:14)

После lrucache.evictall() кэш освобождается и снова появляется достаточно места для выделения. Но я думаю, что это не так.

Любые подсказки?

Вот мой код:

public class StartActivity extends Activity {

    int iMegabyte=1000000;
    LruCache<String, Object> nativelrucache=new LruCache<String, Object>(iMegabyte*10);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);
        // Do my stuff
        Log.v("MEMORY STATE", getMemoryStatus());

        // Case with MyDataClass ------------------------------------------------------------------------------------
        for(int i=0;i<100;i++){
            MyDataClass mdataclass=new MyDataClass(iMegabyte);
            //lrucachemanager.put("ID_" + i, mdataclass);
            Log.v("MEMORY STATE", "put data into cache : " + i);
            nativelrucache.put("ID_" + i, mdataclass);
                        //nativelrucache.evictAll();
        }
    }
}

public class MyDataClass {
    byte[] bytes;

    public MyDataClass(int iSize){
        //Arrays.fill( bytes, 0 );
        bytes=new byte[iSize];
    }
}

person mcfly soft    schedule 15.05.2014    source источник


Ответы (1)


Из http://developer.android.com/reference/android/util/LruCache.html

По умолчанию размер кэша измеряется количеством записей. Переопределите sizeOf(K, V) для определения размера кеша в разных единицах.

Итак, вы должны сделать что-то вроде этого:

LruCache<String, MyDataClass> nativelrucache=new LruCache<String, MyDataClass>(iMegabyte*10){
    protected int sizeOf(String key, MyDataClass value) {
        return value.bytes.length;
    };
};
person kupsef    schedule 15.05.2014
comment
Здорово ! Большое спасибо. - person mcfly soft; 15.05.2014