Подпись кеша изображения в метаданных Glide - PullRequest
2 голосов
/ 22 апреля 2020

Пользователи могут изменить изображение (заменить его). Как только пользователь изменит свое изображение, я хочу, чтобы новое изображение кэшировалось в Glide, а старое изображение выбрасывалось из кэша.

Я прочитал все в Интернете, но все еще не знаю, как реализовать хорошее решение для этого.

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

GlideApp.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.NONE)
  .skipMemoryCache(true)
  .into(view);

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

Документация Glide гласит:

лучший способ сделать файл кэша недействительным - это изменить ваш идентификатор при изменении содержимого (url, uri, путь к файлу и т. д. * 1047). *) когда возможно. - https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation

Но это невозможно для меня, поэтому в документации Glide говорится:

Поскольку изменения часто трудно или невозможно изменить В качестве идентификаторов Glide также предлагает API signature () для добавления дополнительных данных, которыми вы управляете, в ключ кеша.

И он приводит такой пример:

Glide.with(yourFragment)
    .load(yourFileDataModel)
    .signature(new ObjectKey(yourVersionMetadata))
    .into(yourImageView);

Но вот и все проблема. Что было бы хорошим "yourVersionMetadata"? Как мне создать и поддерживать его? Я видел такие примеры:

.signature(new ObjectKey(Long.toString(System.currentTimeMillis())))

Это приводит к тому, что ключ кеша диска меняется каждый раз, когда я загружаю образ, поэтому он МЕДЛЕННЫЙ. Мне просто нужно это изменить, когда пользователь заменяет изображение. Не каждый раз, когда изображение загружается.

Кто-то писал:

Вы можете сделать что-то вроде генерирования нового UUID или увеличения целого числа при каждом изменении изображения. Если вы go этот маршрут, вам придется отслеживать текущую подпись для каждого изображения где-то. - https://github.com/bumptech/glide/issues/2841

Я не понимаю, как это сделать.

Я также пытался выполнить задачу Asyn c для полного удаления кэша. Это работает, но опять же это очень медленно (и Glide не рекомендует использовать этот подход).

Я не знаю, как я могу просто вставить текущую подпись (что должно быть быстрее) вместо создания новой подпись каждый раз, когда изображение загружается. Помогите? Кажется, он заменяет изображение, и его повторение не должно быть таким сложным!

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я работал над этим в течение нескольких дней.

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

FROM Glide:

На практике лучший способ сделать недействительным файл кэша - это изменить ваш идентификатор при изменении содержимого (url, uri, file путь et c) когда это возможно. - https://bumptech.github.io/glide/doc/caching.html

РЕШЕНИЕ: Измените имя изображения, когда пользователь загружает новое изображение. Получить имя файла и использовать его, например. Как только URL-адрес изображения изменился, Glide понимает, что вы изменили изображение, и обновит кэш соответственно. Это, безусловно, дало мне лучшую производительность.

ПРИ ИСПОЛЬЗОВАНИИ:

.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)

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

0 голосов
/ 27 апреля 2020

Два варианта

1) Чтобы создать уникальную подпись для файла, вы можете рассчитать для него подпись MD5. Он всегда будет уникальным для файла, пока не будет изменен. Посмотрите, как сгенерировать подпись MD5 здесь .

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

File file = new File("path/to/image");
String signature = Long.toString(file.lastModified());
...