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