Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

out of memory issue with volley's disk cache

In my app for Android I'm using Volley for loading images in custom listview.

when i refresh(delete all items and load tiems) listview many times, my app is killed with this message

how can i fix it?

04-26 13:08:01.038: E/dalvikvm-heap(18040): Out of memory on a 1684947261-byte allocation. 04-26 13:08:01.038: I/dalvikvm(18040): "Thread-11094" prio=5 tid=299 RUNNABLE 04-26 13:08:01.038: I/dalvikvm(18040): | group="main" sCount=0 dsCount=0 obj=0x439ea8e8 self=0x7fb55250 04-26 13:08:01.038: I/dalvikvm(18040): | sysTid=18946 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=2102160344 04-26 13:08:01.038: I/dalvikvm(18040): | state=R schedstat=( 109248225 27367764 57 ) utm=9 stm=1 core=2 04-26 13:08:01.038: I/dalvikvm(18040): at com.android.volley.toolbox.DiskBasedCache.streamToBytes(DiskBasedCache.java:~316) 04-26 13:08:01.038: I/dalvikvm(18040): at com.android.volley.toolbox.DiskBasedCache.readString(DiskBasedCache.java:526) 04-26 13:08:01.038: I/dalvikvm(18040): at com.android.volley.toolbox.DiskBasedCache.readStringStringMap(DiskBasedCache.java:549) 04-26 13:08:01.038: I/dalvikvm(18040): at com.android.volley.toolbox.DiskBasedCache$CacheHeader.readHeader(DiskBasedCache.java:392) 04-26 13:08:01.038: I/dalvikvm(18040): at com.android.volley.toolbox.DiskBasedCache.initialize(DiskBasedCache.java:155) 04-26 13:08:01.038: I/dalvikvm(18040): at com.android.volley.CacheDispatcher.run(CacheDispatcher.java:84) 04-26 13:08:01.048: W/dalvikvm(18040): threadid=299: thread exiting with uncaught exception (group=0x41745da0) 04-26 13:08:01.048: I/SpenGestureManager(847): setFocusWindow0 04-26 13:08:01.048: D/PointerIcon(847): setHoveringSpenIconStyle1 pointerType: 10001iconType:1 flag:0 04-26 13:08:01.048: D/PointerIcon(847): setHoveringSpenCustomIcon IconType is same.1 04-26 13:08:01.048: E/AndroidRuntime(18040): FATAL EXCEPTION: Thread-11094 04-26 13:08:01.048: E/AndroidRuntime(18040): Process: com.android.myapp, PID: 18040 04-26 13:08:01.048: E/AndroidRuntime(18040): java.lang.OutOfMemoryError 04-26 13:08:01.048: E/AndroidRuntime(18040): at com.android.volley.toolbox.DiskBasedCache.streamToBytes(DiskBasedCache.java:316) 04-26 13:08:01.048: E/AndroidRuntime(18040): at com.android.volley.toolbox.DiskBasedCache.readString(DiskBasedCache.java:526) 04-26 13:08:01.048: E/AndroidRuntime(18040): at com.android.volley.toolbox.DiskBasedCache.readStringStringMap(DiskBasedCache.java:549) 04-26 13:08:01.048: E/AndroidRuntime(18040): at com.android.volley.toolbox.DiskBasedCache$CacheHeader.readHeader(DiskBasedCache.java:392) 04-26 13:08:01.048: E/AndroidRuntime(18040): at com.android.volley.toolbox.DiskBasedCache.initialize(DiskBasedCache.java:155) 04-26 13:08:01.048: E/AndroidRuntime(18040): at com.android.volley.CacheDispatcher.run(CacheDispatcher.java:84) 04-26 13:08:01.058: W/ActivityManager(847): Force finishing activity com.android.myapp/.feedlist.Feedlist

like image 245
user3546708 Avatar asked Apr 26 '14 17:04

user3546708


2 Answers

Have you tried

RequestQueue volleyQueue = Volley.newRequestQueue(this);
DiskBasedCache cache = new DiskBasedCache(getCacheDir(), 16 * 1024 * 1024);
volleyQueue = new RequestQueue(cache, new BasicNetwork(new HurlStack()));
volleyQueue.start();

from

https://stackoverflow.com/a/21299261/3399432

This changes the cache size

like image 100
UtsavShah Avatar answered Oct 12 '22 22:10

UtsavShah


I was having a very similar issue with loading images into a ListView. It seems you have to handle pulling from the cache yourself.

Below is my implementation which I have in my public View getView(int position, View convertView, ViewGroup parent) adapter method:

Bitmap cachedBitmap = imageCache.getBitmap(item.getPhotoUrl());
if (cachedBitmap != null)
{
    holder.photo.setImageBitmap(cachedBitmap);
}
else {
    ImageLoader imageLoader = new ImageLoader(Volley.newRequestQueue(this.context), imageCache);
    imageLoader.get(item.getPhotoUrl(), new ImageLoader.ImageListener() {
        @Override
        public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
            if (item.getPhotoUrl() != null && response.getBitmap() != null)
                imageCache.putBitmap(item.getPhotoUrl(), response.getBitmap());
        }

        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    //This is a custom imageview, you can create your own implementation for loading the image url to the imageview
    holder.photo.setImageUrl(item.getPhotoUrl(), imageLoader);
}
like image 37
Chackle Avatar answered Oct 12 '22 22:10

Chackle