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

Сценарий:

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

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

Я просмотрел Caching and Cache Invalidation на странице Glide github. Я также пошел, несмотря на поток группы Google "Обеспечение загрузки только изображений с диска с диска" , в котором показано, как получить кеш формы изображения. Я также прошел через Как сделать недействительным вопрос о кешировании 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);

Вопросы:

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

  • В приведенной выше статье кэширования указано следующее:

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

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

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

Ответы

Ответ 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, поэтому, когда кеш заполнен, последнее изображение будет удалено. Вы можете легко настроить размер кеша, чтобы помочь ему, если хотите. Перейдите на страницу вики Configuration, чтобы узнать, как изменить размер кеша.

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

Ответ 2

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

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

Счастливое кодирование!!