0

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

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

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

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

ответ

0

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

     }; 
      } 
}; 
    ... 

 Смежные вопросы

  • Нет связанных вопросов^_^