2014-04-26 8 views
7

In meiner App für Android verwende ich Volley zum Laden von Bildern in benutzerdefinierten Listenansicht.Speicherproblem mit Volley-Disk-Cache

wenn i Listenansicht oft aktualisieren (alle Elemente und Last tiems löschen) wird meine App mit dieser Nachricht getötet

, wie ich es beheben kann?

04-26 13: 08: 01,038: E/dalvikvm-Heap (18040): Nicht genügend Speicher auf einer 1684947261 Byte Zuordnung. 04-26 13: 08: 01.038: I/dalvikvm (18040): "Gewinde-11094" prio = 5 tid = 299 RUNNABLE 04-26 13: 08: 01.038: I/dalvikvm (18040): | group = "main" sCount = 0 dsCount = 0 obj = 0x439ea8e8 selbst = 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): | Zustand = R schedstat = (109248225 27367764 57) utm = 9 stm = 1 Kern = 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): um com.android.volley.toolbox.DiskBasedCache.readString (DiskBasedCache.java:526) 04-26 13:08: 01.038: I/dalvikvm (18040): unter com.android.volley.toolbox.DiskBasedCache.readStringStringMap (DiskBasedCache.java:549) 04-26 13: 08: 01.038: I/dalvikvm (18040): bei com.android. volley.toolbox.DiskBasedCache $ CacheHeader.readHeader (DiskBasedCache.java:392) 04-26 13: 08: 01.038: I/dalvikvm (18040): um com.android.volley.toolbox.DiskBasedCache.initialize (DiskBasedCache.java: 155) 04-26 13: 08: 01.038: I/dalvikvm (18040): unter com.android.volley.CacheDispatcher.run (CacheDispatcher.java:84) 04-26 13: 08: 01.048: W/dalvikvm (18040): threadid = 299: Thread mit nicht abgefangener Ausnahme beenden (Gruppe = 0x41745da0) 04-26 13: 08: 01.048: I/SpenGestureManager (847): setFocusWindow0 04-26 13: 08: 01.048: D/ZeigerIcon (847): setHoveringSpenIconStyle1 ZeigerTyp: 10001iconType: 1 Kennzeichen: 0 04-26 13: 08: 01.048: D/ZeigerIcon (847): setHoveringSpenCustomIcon SymbolTyp ist gleich.1 04 -26 13: 08: 01.048: E/AndroidRuntime (18040): FATALE AUSNAHME: Thread-11094 04-26 13: 08: 01.048: E/AndroidRuntime (18040): Prozess: 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): um com.android.volley.toolbox.DiskBasedCache.streamToBytes (DiskBasedCache.java:316) 04-26 13: 08: 01.048: E/AndroidRuntime (18040): um com.android.volley.toolbox.DiskBasedCache.readString (DiskBasedCache.java:526) 04-26 13: 08: 01.048: E/AndroidRuntime (18040): um com.android.volley.toolbox.DiskBasedCache.readStringStringMap (DiskBasedCache.java:549) 04-26 13: 08: 01.048: E/AndroidRuntime (18040): um com.android.volley.toolbox.DiskBasedCache $ CacheHeader.readHeader (DiskBasedCache.java:392) 04-26 13: 08: 01.048: E/AndroidRuntime (18040): um com.android.volley.toolbox.DiskBasedCache.initialize (DiskBasedCache.java:155) 04-26 13:08: 01.048: E/AndroidRuntime (18040): um com.android.volley.CacheDispatcher.run (CacheDispatcher.java:84) 04-26 13: 08: 01.058: W/ActivityManager (847): Erzwingen Abschluss Aktivität com.android. myapp/.feedlist.Feed

+0

jede Lösung für dieses? – CQM

+1

Diese Frage ist fast 2 Jahre alt, aber ich suche immer noch nach einer Lösung. [Diese Frage] (https://stackoverflow.com/questions/24095909/volley-out-of-memory-error-weird-allocation-attempt/24422376#comment54546831_24422376) ist ähnlich, aber die Antwort funktioniert nicht für mich. OP hast du es jemals herausgefunden? – yuval

Antwort

1

Haben Sie

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

von

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

Dadurch ändert dich die Cache-Größe

1

Ich war mit Laden von Bildern in ein Listview ein sehr ähnliches Problem habe. Es scheint, dass Sie selbst aus dem Cache ziehen müssen.

Unten ist meine Implementierung, die ich in meinem public View getView(int position, View convertView, ViewGroup parent) Adapter Methode haben:

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); 
}