web-dev-qa-db-de.com

Volley Image Caching

Ich versuche Volleys Bild-Caching zu verstehen. Ich habe ein Fragment mit Gridview darin, das etwa 12-30 Bilder laden wird. Dort werden Bilder vom Server abgerufen und ich verwende NetworkImageView zum Laden dieser Bilder.

Ich kann die Bilder in NetworkImageView anzeigen und alles funktioniert einwandfrei. Wenn ich jedoch von einem fragmentzu einem anderen LogCatwechsle und zum vorherigen Fragment zurückkehre, versuche Volley, die Bilder erneut abzurufen.

Ich habe gelesen, dass Volley sich automatisch um das Caching von Bildern kümmert. Wenn das Bild im ersten fragmentzwischengespeichert wird, warum versucht es, das Bild erneut abzurufen, als ich vom zweiten zum ersten zurückkam? In erster Linie zeigen die Daten LogCatdie Bildanforderungen von Volley an? oder etwas anderes...

Unten ist mein Code:

In onCreate ()

queue = Volley.newRequestQueue(getActivity());
imageLoader = new ImageLoader(queue, new ImageLoader.ImageCache() {
    private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(
            10);

    public void putBitmap(String url, Bitmap bitmap) {
        mCache.put(url, bitmap);
    }

    public Bitmap getBitmap(String url) {
        return mCache.get(url);
    }
});

Logcat beim ersten Laden des Fragments:

02-18 14:21:20.724: D/Volley(14713): [4944] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2> [lifetime=3782], [size=398563], [rc=200], [retryCount=0]
02-18 14:21:20.874: D/Volley(14713): [4943] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/st-vincent.jpg 0x800c5bdc LOW 3> [lifetime=3941], [size=501475], [rc=200], [retryCount=0]
02-18 14:21:20.894: D/Volley(14713): [1] Request.finish: 4181 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2
02-18 14:21:20.974: D/Volley(14713): [1] Request.finish: 4260 ms: [ ] http://xx.files.wordpress.com/2014/02/st-vincent.jpg 0x800c5bdc LOW 3
02-18 14:21:20.994: D/dalvikvm(14713): GC_FOR_ALLOC freed 1914K, 6% free 68371K/72184K, paused 11ms, total 11ms
02-18 14:21:20.994: I/dalvikvm-heap(14713): Grow heap (frag case) to 72.368MB for 5843106-byte allocation
02-18 14:21:21.014: D/dalvikvm(14713): GC_FOR_ALLOC freed 1K, 5% free 74076K/77892K, paused 15ms, total 15ms
02-18 14:21:21.074: D/Volley(14713): [1] Request.finish: 4336 ms: [ ] http://xx.files.wordpress.com/2014/02/underwater.gif 0x800c5bdc LOW 8
02-18 14:21:21.214: D/Volley(14713): [4945] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-4-24-04-pm.png 0x800c5bdc LOW 5> [lifetime=4155], [size=482380], [rc=200], [retryCount=0]
02-18 14:21:21.244: D/Volley(14713): [1] Request.finish: 4494 ms: [ ] http://xx.files.wordpress.com/2014/01/albarn-everyday-robots.jpg 0x800c5bdc LOW 9
02-18 14:21:21.274: D/Volley(14713): [1] Request.finish: 4551 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-4-24-04-pm.png 0x800c5bdc LOW 5
02-18 14:21:21.994: D/Volley(14713): [1] Request.finish: 5244 ms: [ ] http://xx.files.wordpress.com/2014/02/macdemarco_baby.jpg 0x800c5bdc LOW 10
02-18 14:21:22.934: D/Volley(14713): [1] Request.finish: 6183 ms: [ ] http://xx.files.wordpress.com/2014/01/nenehcherry_lank01.jpg 0x800c5bdc LOW 11

Wenn ich zum zweiten Mal zum selben Fragment zurückkehre: Habe gerade das zweite Fragment besucht und bin zum ersten Fragment zurückgekehrt - Keine große Lücke dazwischen.

02-18 14:27:46.164: D/dalvikvm(14713): GC_FOR_ALLOC freed 29047K, 26% free 91776K/122752K, paused 23ms, total 23ms
02-18 14:27:47.994: D/dalvikvm(14713): GC_FOR_ALLOC freed 2957K, 21% free 97010K/122752K, paused 20ms, total 20ms
02-18 14:27:48.274: D/Volley(14713): [1] Request.finish: 3244 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-2-58-16-pm.png 0x800c5bdc LOW 6
02-18 14:27:48.294: D/dalvikvm(14713): GC_FOR_ALLOC freed 2007K, 21% free 97932K/122752K, paused 14ms, total 14ms
02-18 14:27:48.324: D/Volley(14713): [4956] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2> [lifetime=3272], [size=398563], [rc=200], [retryCount=0]
02-18 14:27:48.484: D/Volley(14713): [1] Request.finish: 3456 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-11-57-29-pm.png 0x800c5bdc LOW 2
02-18 14:27:48.974: D/dalvikvm(14713): GC_FOR_ALLOC freed 1030K, 15% free 104815K/122752K, paused 56ms, total 56ms
02-18 14:27:49.054: D/Volley(14713): [1] Request.finish: 4022 ms: [ ] http://xx.files.wordpress.com/2014/02/screen-shot-2014-02-17-at-4-24-04-pm.png 0x800c5bdc LOW 5
02-18 14:27:49.314: D/Volley(14713): [1] Request.finish: 4276 ms: [ ] http://xx.files.wordpress.com/2014/01/albarn-everyday-robots.jpg 0x800c5bdc LOW 9
02-18 14:27:49.374: D/Volley(14713): [1] Request.finish: 4325 ms: [ ] http://xx.files.wordpress.com/2014/01/nenehcherry_lank01.jpg 0x800c5bdc LOW 11
02-18 14:27:49.404: D/Volley(14713): [1] Request.finish: 4355 ms: [ ] http://xx.files.wordpress.com/2014/02/macdemarco_baby.jpg 0x800c5bdc LOW 10
02-18 14:27:49.654: D/dalvikvm(14713): GC_FOR_ALLOC freed 1456K, 12% free 108705K/122752K, paused 27ms, total 27ms
02-18 14:27:49.734: D/Volley(14713): [1] Request.finish: 4691 ms: [ ] http://xx.files.wordpress.com/2014/02/underwater.gif 0x800c5bdc LOW 8
02-18 14:27:50.304: D/dalvikvm(14713): GC_FOR_ALLOC freed 11584K, 16% free 103314K/122752K, paused 47ms, total 47ms
02-18 14:27:50.334: D/Volley(14713): [1] Request.finish: 5281 ms: [ ] http://xx.files.wordpress.com/2014/02/echo-and-the-bunnymen.jpg 0x800c5bdc LOW 12

Wie die Links zeigen, greift Volley auf dieselben URLs zu. Versucht Volley, Bilder vom Server abzurufen? oder werden nur die URLs angezeigt, die aus dem Cache geladen werden?

Wie erstelle ich Volley-Cache-Bilder? Was kann ich tun, wenn das Caching mit meinem obigen Code derzeit nicht funktioniert?

Ich habe versucht, den Wert für maxSizevon 10 in 100*1024*1024 (100MB) zu ändern, aber das hat nicht aufgehört, dass Volley die gleichen Werte ausgegeben hat.

12
Vamsi Challa

Volley hat die Caching-Option nicht direkt angegeben. Sie müssen Ihre eigenen mit dem Tool von Volley erstellen. Siehe Network Image Caching , Jake Wharton hatte über den Caching-Mechanismus mit Volley geschrieben. Jake Whartons Volley-Anpassung

11
Tofeeq

Verwenden Sie Volley als Singleton? Wenn dies nicht der Fall ist und Sie keinen gemeinsamen Kontext für die requestQueue verwenden, funktioniert dies nicht wie erwartet. Die Dokumentation zu diesem Teil von Volley ist besonders wenig hilfreich (zumindest seit ich sie das letzte Mal benutzt habe). Sobald es richtig konfiguriert ist, liest/schreibt es wie erwartet aus dem Cache.

Hier ist ein GitHub-Projekt mit einer VolleySingleton-Klasse, die Sie zusammen mit Beispielen verwenden können: CypressNorth/Volley-Singleton

Hier ist ein Blog-Beitrag, der das Setup detaillierter beschreibt: Einrichten des Android Google Volley ImageLoader für NetworkImageView

1
Matt Mombrea

Erwägen Sie die Verwendung von Glide, das Android zum Laden von Bildern in Ihre App empfiehlt. Im Vergleich zu Volleyball bietet Glide eine automatische Bildzwischenspeicherung.

So fügen Sie Glide in Ihre App hinzu:

Schritt 1) ​​Aktualisieren Sie die build.gradle-Datei

dependencies {
    compile 'com.github.bumptech.glide:glide:3.6.1'
    compile 'com.Android.support:support-v4:19.1.0'
  }

Schritt 2) Fügen Sie die INTERNET-Berechtigung in die Manifestdatei ein

<uses-permission Android:name="Android.permission.INTERNET" />

Schritt 3) Fügen Sie ImageView in Ihr Layout ein

<ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:id="@+id/imageView"
    >
</ImageView>

Schritt 4) Verwendung in der Aktivität gleiten

    //Initialize ImageView
    ImageView imageView = (ImageView) findViewById(R.id.imageView);

    //Loading image from below url into imageView
   Glide.with(this)
        .load("IMAGE URL HERE")
        .placeholder(R.drawable.placeholder)
        .error(R.drawable.imagenotfound)
        .override(200, 200);
        .centerCrop();
        .into(imageView);

Lesen Sie mehr auf Android Glide Library

1
macbee

Unter dem folgenden Link sehen Sie die Fortsetzung meiner Frage zur Implementierung von Image Caching mit Volley mithilfe von Jake Whartons DiskLruCache und VolleyImageCacheExample. Es funktioniert wie erwartet und die Bilder werden zwischengespeichert. Danke für deine Hilfe.

JakeWharton DiskLruCache - Wie mit Volley zu implementieren?

1
Vamsi Challa

Die einfachste Möglichkeit, mit Volley Bilder zwischenzuspeichern, war die Verwendung einer RequestQueue mit einer DiskBasedCache. Mein Ziel war es, die Bandbreite zu reduzieren, anstatt die Ladezeiten zu verkürzen. Dies hält auch den Speicherbedarf gering.

 val cacheSizeInMegabytes = 5
 val cacheSizeInBytes = cacheSizeInMegabytes * 1024 * 1024
 val cacheDir = File(context.cacheDir, "volleyCache")
 val cache = DiskBasedCache(cacheDir, cacheSizeInBytes)

 val httpStack = HurlStack()
 val networkStack = BasicNetwork(httpStack)

 val queue = RequestQueue(cache, networkStack)
 queue.start()

Verwenden Sie dann einfach die queue und stellen Sie sicher, dass request.setShouldCache(true) vorliegt (oder nicht).

0
RhodanV5500

Sie können dies überprüfen, ich hatte L1 und L2 Caching-Mechanismus für Volley aktiviert.

Volley mit Caching . Stellen Sie sicher, dass die Cache-Steuerung im Antwortheader aktiviert ist.

0
sreekumar