0

Ich habe meine Füße in die Welt der Android-Entwicklung eingetaucht und ich habe Volley und LruCache verwendet, um eine grundlegende News Reader App zusammenzustellen.NetworkImageView Caches skalierte Bild statt Original

Ich habe eine Recycler-Ansicht, in der jede Zelle eine NetworkImageView aus der Volley-Bibliothek enthält. Ich kann auf diese Zelle tippen und es öffnet sich eine weitere Aktivität, die eine Art Detailansicht darstellt, die eine größere Version des Bildes in der Zelle anzeigt. Ich benutze die gleiche URL, wenn ich die setImageURL-Methode für NetworkImageView verwende, aber es wird mir klar, dass NetworkImageView die Größe des Bildes an den Schlüssel anfügt, mit dem das Bild im LruCache zwischengespeichert wird. Dies bedeutet, dass trotz zwei gleichen URLs zwei NetworkImageViews unterschiedlicher Größe zwei Netzwerkanrufe und nicht einen Netzwerkanruf und einen Aufruf für den Cache erstellen.

In gewisser Weise macht dies Sinn, warum würden Sie ein Bild größer als Sie benötigen, zwischenspeichern? Wie auch immer, ich habe mich gefragt, ob es möglich ist, das Originalbild im Cache zu speichern, eher als ein verkleinertes?

Ich hoffe, das macht Sinn, danke, David.

Antwort

0

LruBitmapCache für den ImageLoader ist nicht identisch mit dem HTTP-Cache (mit der Standardimplementierung DiskBasedCache). Im Zwischenspeicher zwischenspeichern Sie die eaxct-Bitmap in der Größe, in der sie angezeigt werden soll, da sonst bei jeder Verbindung einige Operationen im Bilddatenfeld ausgeführt werden müssen, wenn Sie einen Container einfügen müssen. http-Cache oder DiskBasedCache cachen jedoch die ursprüngliche Antwort.

Der Grund, warum Sie zwei Aufrufe trotzdem vornehmen, ist wahrscheinlich, weil Sie Bildantworten über Cache-Header verfügen, die Caching ermöglichen. Sie können dieses Verhalten jedoch ändern und das Zwischenspeichern erzwingen. Sie müssen ImageLoader anpassen, da dies die Bildanforderungen erzeugt. Sie müssen "makeImageRequest" überschreiben:

 ... 
mImageLoader = new ImageLoader(this.mRequestQueue, 
        new LruBitmapCache()) { 
    @Override 
     protected Request<Bitmap> makeImageRequest(String requestUrl, int maxWidth, int maxHeight, 
        ScaleType scaleType, final String cacheKey) { 
       return new ImageRequest(requestUrl, new Listener<Bitmap>() { 
        @Override 
        public void onResponse(Bitmap response) { 
         onGetImageSuccess(cacheKey, response); 
        } 
       }, maxWidth, maxHeight, scaleType, Config.RGB_565, new ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         onGetImageError(cacheKey, error); 
        } 
       }){ 
      @Override 
        public Response<Bitmap> parseNetworkResponse(NetworkResponse response) { 
         Response<Bitmap> resp = super.parseNetworkResponse(response); 
         if(!resp.isSuccess()) { 
        return resp; 
       } 
       long now = System.currentTimeMillis(); 
       Cache.Entry entry = resp.cacheEntry; 
if(entry == null) { 

    entry = new Cache.Entry(); 
    entry.data = response.data; 
    entry.responseHeaders = response.headers; 
} 
entry.ttl = now + 30l * 24 * 60 * 60 * 1000; //keeps cache for 30 days 
entry.softTtl = now + 24 * 60 * 60 * 1000; // keeps valid(no refresh) for 1 day 
          return Response.success(resp.result, entry); 
         } 

     }; 
      } 
}; 
    ...