0

私はAndroid開発の世界に足を踏み入れてきました。私はVolleyとLruCacheを使って基本的なニュースリーダーアプリを作りました。NetworkImageViewはオリジナルではなくリサイズされた画像をキャッシュする

各セルにVolleyライブラリのNetworkImageViewが含まれているリサイクルビューがあります。私はそのセルをタップすることができ、それはセル内のより大きなバージョンのイメージを表示する一種の詳細ビューである別のアクティビティを開きます。 NetworkImageViewでsetImageURLメソッドを使用する際に同じURLを使用しますが、NetworkImageViewがLruCacheのイメージをキャッシュするために使用するキーにイメージのサイズを追加することは明らかです。これは、URLが同じであっても、サイズの異なる2つのNetworkImageViewが1つのネットワークコールではなく2つのネットワークコールを作成し、1つがキャッシュへのコールを作成することを意味します。

これは意味がありますが、なぜイメージを必要以上にキャッシュするのでしょうか?しかし、サイズ変更されたイメージではなく元のイメージをキャッシュすることが可能かどうかは疑問でした。

感謝します、ありがとう、David。

答えて

0

ImageLoaderのLruBitmapCacheは、httpキャッシュと同じではありません(デフォルト実装のDiskBasedCacheを使用)。 lruキャッシュでは、表示するサイズのeaxctビットマップをキャッシュします。そうしないと、コンテナに入れなければならないときにイメージ・データ配列に対して何らかの操作を実行する必要があります。しかし、httpキャッシュまたはDiskBasedCacheは元の応答をキャッシュします。

なぜか2つの呼び出しを行う理由は、画像の応答にキャッシュを許可するキャッシュヘッダーがないためです。ただし、この動作を変更してキャッシュを適用することはできます。 ImageLoaderをカスタマイズする必要があります。これは、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); 
         } 

     }; 
      } 
}; 
    ... 
関連する問題