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

Сценарий:

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

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

Я прошел Кэширование и Инвалидацию кеша на странице github Glide. Я также рассказал о ветке группы Google " Гарантировать, что изображения загружаются только из дискового кэша", в которой показано, как получить кэш форм изображений. Я также прошел через Как сделать недействительным кеш Glide для некоторых конкретных изображений.

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

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. Кэширующая статья выше упоминает следующее:

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

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

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

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

Удачного кодирования!

Другие вопросы по тегам