NetworkImageView кэширует изображение с измененным размером, а не исходное

Я окунулся в мир разработки для Android и использовал Volley и LruCache для создания простого приложения для чтения новостей.

У меня есть представление переработчика, где каждая ячейка содержит NetworkImageView из библиотеки Volley. Я могу нажать на эту ячейку, и она откроет другое действие, которое является своего рода подробным представлением, которое отображает увеличенную версию изображения в ячейке. Я использую тот же URL-адрес при использовании метода setImageURL в NetworkImageView, но мне становится очевидным, что NetworkImageView добавляет размер изображения к ключу, который он использует для кэширования изображения в LruCache. Это означает, что даже если URL-адрес один и тот же, два объекта NetworkImageView разных размеров создадут два сетевых вызова, а не один сетевой вызов, и один вызов кэша.

В некотором смысле это имеет смысл, зачем кэшировать изображение большего размера, чем вам нужно? Однако мне было интересно, можно ли кэшировать исходное изображение, а не измененное?

Надеюсь, это имеет смысл, спасибо, Дэвид.


person lateAtNight    schedule 16.04.2016    source источник


Ответы (1)


LruBitmapCache для ImageLoader отличается от HTTP-кэша (с реализацией DiskBasedCache по умолчанию). В кэше lru вы кэшируете растровое изображение eaxct с размером, который он будет отображать, иначе вам нужно будет выполнять некоторые операции с массивом данных изображения каждый раз, когда вам нужно поместить его в контейнер. http cache или 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);
                        }

        };
            }
};
    ...
person kalin    schedule 17.04.2016