Glide: как найти, если изображение уже кэшировано и использовать кэшированную версию?

сценарий:

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

что я пробовал:

Я прошел через кэширование и недействительность кэша на странице Github Glide. Я также пошел, хотя Google Group thread Обеспечение Загрузки Изображений Только Из Кэша Диска, который показывает, как получить изображение кэша. Я тоже прошел через как аннулировать кэш Glide для некоторых конкретных изображений вопрос.

из ссылок выше я вижу следующий код sniplet, который показывает, как загрузить изображение из кэша. Однако это только пытается получить изображение от кэш. Если его нет в кэше, он не пытается получить из сети и терпит неудачу:

Glide.with(TheActivity.this)
        .using(new StreamModelLoader<String>() {
            @Override
            public DataFetcher<InputStream> getResourceFetcher(final String model, int i, int i1) {
                return new DataFetcher<InputStream>() {
                    @Override
                    public InputStream loadData(Priority priority) throws Exception {
                        throw new IOException();
                    }

                    @Override
                    public void cleanup() {
                    }

                    @Override
                    public String getId() {
                        return model;
                    }

                    @Override
                    public void cancel() {
                    }
                };
            }
        })
       .load("http://sampleurl.com/sample.gif")
       .diskCacheStrategy(DiskCacheStrategy.SOURCE)
       .into(theImageView);

вопросы:

  1. есть ли более чистый способ достичь следующего: показать GIF-изображение из кэша, если присутствует еще скачать GIF, кэшировать его для последующего использования и показать его в ImageView.

  2. в статье кэширования выше упоминается следующее:

    на практике, лучший способ invalidate файл кэша должен измениться Ваш идентификатор при изменении содержимого (url, uri, путь к файлу и т. д.)

    сервер отправляет другой URL-адрес в приложение, когда истекает предыдущий. В этом случае я считаю, что старое изображение в конечном итоге будет собрано мусором? Есть ли способ принудительно удалить изображение из кэша?

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

2 ответов


  1. вам не нужен пользовательский ModelLoader, чтобы показать GIF из кэша, если он присутствует и получить его в противном случае, это фактически поведение Glide по умолчанию. Просто использование стандартной линии загрузки должно работать нормально:

    Glide.with(TheActivity.this)
       .load("http://sampleurl.com/sample.gif")
       .diskCacheStrategy(DiskCacheStrategy.SOURCE)
       .into(theImageView);
    

ваш код предотвратит Glide от загрузки GIF и покажет только GIF, если он уже кэширован, что звучит так, как будто вы не хотите.

  1. Да, старые изображения будут удалены. По умолчанию Glide использует кэш LRU, поэтому, когда кэш заполнен, наименее недавно использованное изображение будет удалено. Вы можете легко настроить размер кэша, чтобы помочь этому, если хотите. Вижу конфигурация страница wiki для изменения размера кэша.

  2. к сожалению, нет никакого способа повлиять на содержимое кэша напрямую. Нельзя удалить элемент явным образом или принудительно сохранить его. На практике с соответствующим размером дискового кэша обычно тебе не нужно беспокоиться ни о том, ни о другом. Если вы показываете свое изображение достаточно часто, оно не будет выселено. При попытке кэшировать дополнительные элементы и исчерпать пространство в кэше старые элементы будут автоматически вытеснены, чтобы освободить место.


 Glide.with(context)
 .load("http://sampleurl.com/sample.gif")
 .skipMemoryCache(true)
 .into(imageView);

вы уже заметили, что мы назвали .skipMemoryCache (true), чтобы конкретно сказать Glide пропустить кэш памяти. Это означает, что Glide не будет помещать изображение в кэш памяти. Важно понимать, что это влияет только на кэш-память! Glide по-прежнему будет использовать дисковый кэш, чтобы избежать другого сетевого запроса для следующего запроса к тому же URL-адресу изображения.для этого Glide кэш и оптимизация запросов.

удачи в кодировании!!