0

我一直沉浸在Android開發的世界,我一直在使用Volley和LruCache來組裝一個基本的新聞閱讀器應用程序。NetworkImageView緩存調整大小的圖像,而不是原始的

我有一個回收站視圖,其中每個單元格包含來自Volley庫的NetworkImageView。我可以點擊該單元格,並打開另一個活動,這是一種細節視圖,它在單元格中顯示更大版本的圖像。在NetworkImageView上使用setImageURL方法時,我使用相同的URL,但對我而言,NetworkImageView會將圖像的大小附加到用來在LruCache中緩存圖像的密鑰。這意味着即使URL是相同的,兩個不同大小的NetworkImageViews將創建兩個網絡調用,而不是一個網絡調用,以及一個調用緩存。

在某些方面,這是有道理的,爲什麼你會緩存大於你需要的圖像?但是,我想知道是否可以緩存原始圖像而不是重新調整大小的圖像?

我希望這很有意義,謝謝大衛。

回答

0

ImageLoader的LruBitmapCache與http緩存(具有默認實現DiskBasedCache)不同。在lru緩存中,你會緩存eaxct位圖的大小,否則當你需要放入一個容器時,你需要在圖像數據數組上執行一些操作。但是http緩存或DiskBasedCache緩存原始響應。

因此,無論如何你打2個電話的原因可能是因爲你的圖像響應沒有緩存頭允許緩存。但是,您可以更改此行爲並強制緩存。您需要自定義ImageLoader,因爲這是創建圖像請求的人。您必須覆蓋「makeImageRequest」:

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

     }; 
      } 
}; 
    ... 
相關問題