2013-07-15 3 views
6

Я пытаюсь отобразить список с большим количеством (удаленных) изображений. Я пытаюсь использовать залп для задания.Захват волейбола и растрового изображения

Волейбол несколько работает, но недостаточно. В ImageLoader.get залпа имеет следующий фрагмент кода:

final String cacheKey = getCacheKey(requestUrl, maxWidth, maxHeight); 

    // Try to look up the request in the cache of remote images. 
    Bitmap cachedBitmap = mCache.getBitmap(cacheKey); 
    if (cachedBitmap != null) { 
     // Return the cached bitmap. 
     ImageContainer container = new ImageContainer(cachedBitmap, requestUrl, null, null); 
     imageListener.onResponse(container, true); 
     return container; 
    } 

Однако getCacheKey производит ключ, как это:

/** 
* Creates a cache key for use with the L1 cache. 
* @param url The URL of the request. 
* @param maxWidth The max-width of the output. 
* @param maxHeight The max-height of the output. 
*/ 
private static String getCacheKey(String url, int maxWidth, int maxHeight) { 
    return new StringBuilder(url.length() + 12).append("#W").append(maxWidth) 
      .append("#H").append(maxHeight).append(url).toString(); 
} 

т.е. он добавляет некоторые «метаданные», как ширина и высота до ключа.

Этот ключ никогда не производит удар, и если изображение не находится в кеше L1, оно извлекается онлайн. Когда изображение загружается онлайн, оно сохраняется в кэш-памяти диска, но волейбол сохраняет его с URL-адресом (и только URL-адресом) в качестве ключа.

Ожидается ли такое поведение? Я что-то упускаю?

+0

это может зависеть от заголовков от вашего ответа – njzk2

+1

вы поняли, почему залп не производит удар? – iamrelos

+0

Вы можете использовать [droidQuery] (http://bit.ly/droidquery) для завершения async restful запросов (Ajax) и упростить управление кэшированием (независимо от того, хотите ли вы сохранить кешированный объект или нет). – Phil

ответ

-1

Это точный способ, которым вы хотите, чтобы он работал.

  1. Удалите URL-адрес и получите изображение, если оно недоступно.
  2. Загрузите изображение из кеша, если оно доступно.
+0

Это не имеет смысла. Прежде всего, вы хотите загрузить изображение из кеша, прежде чем нажимать на URL. Во-вторых, это не отвечает на мой вопрос о том, как работают волейбол. – Markus

+0

Я понял ваш вопрос так, как будто он работал так, как вы упомянули выше. –

+0

Я не понимаю, что вы говорите. Я спросил: «Почему внутренний кеш зрителя никогда не производит удар» – Markus

1

Можете ли вы опубликовать свой класс, который реализует ImageCache.

Я просто смотрел на это сам и понял в своем коде. Я не добавлял растровое изображение в кэш памяти, когда он загружал его с диска, поэтому он всегда будет перезагружать его с диска каждый раз.

Это простой пример того, что я имею в виду и где я буду неправильно

@Override 
    public Bitmap getBitmap(String cachKey) { 

     Bitmap b = null; 

      //check the memory first 
      b = memoryCache.get(cacheKey); 
      if(b == null){ 
       //memory cache was null, check file cache   
       b = diskLruImageCache.getBitmap(cacheKey); 

       // this is where it needs to be added to your memory cache 
       if(b != null){ 
        memoryCache.put(url, b); 
       } 
      } 



     return b; 
    } 
9

Причина вы не получаете никаких хитов, потому что поведение по умолчанию в Volley для кэширования диска зависит от HTTP заголовки элемента, который вы запрашиваете (в вашем случае, изображение).

Путь Volley работы является:

  1. ImageLoader проверяет кэш L1 для изображения (кэш-память, предоставленная вами в ImageLoader в конструкторе). Если доступно обратное изображение.
  2. Запрос обработчик RequestQueue. Он проверяет L2 (кэш диска) для изображения.
  3. Если вы обнаружили в кеше диска, проверьте время истечения срока действия изображения. Если не истек, вернитесь.
  4. Скачайте изображение и верните его.
  5. Сохранить изображение в кешках.

Если вы хотите настройки по умолчанию для работы, изображения должны иметь заголовок Cache-Control как max-age=??? где вопросительные знаки указывают на достаточное количество секунд от времени он был загружен.

Если вы хотите изменить поведение по умолчанию, я не уверен, но я думаю, вам нужно немного изменить код.

Посмотрите на класс CacheDispatcher в источнике Volley.

1

Я отследил эту проблему в своем приложении сегодня. Я устанавливал максимальный размер кеша в КБ в конструкторе, но сообщал размер в байтах в sizeOf(), поэтому ничего не кэшировалось.

This answer Установить меня прямо.

0

Волейбол ничего не кэширует, если в заголовке ответа не задано управление кешем.

Проверьте HttpHeaderParser реализация класса в Волейбол.

Кэширование может основываться на максимальном возрасте или E-теге. Проверьте заголовок ответа и определите все, что там установлено. Это будет выглядеть примерно так.

Cache-Control → общественности, макс возраста = 300

Cache Header info

1

Возможно, вы используете NetworkImageView для загрузки изображений. Вы можете использовать ImageView и ImageLoader, чтобы сделать то же самое. Используя ImageLoader, метаданные в ключе похожи на «# W0 # H0» для любого размера изображения.

ImageLoader imageLoader = getImageLoader(); 
imageLoader.get(url, ImageLoader.getImageListener(imageView, defaultDrawable, errorDrawable)); 
Смежные вопросы