Подтвердить что ты не робот

Удалить изображение из кеша в библиотеке Glide

Я использую Glide в одном из моих проектов, чтобы показать изображение из файла.

Ниже мой код, как я показываю изображение:

Glide.with(DemoActivity.this)
     .load(Uri.parse("file://" + imagePath))
     .into(mImage);

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

Если я изменил изображение в местоположении imagePath с другим изображением с таким же именем, тогда Glide отобразит первое изображение вместо нового.

Два запроса:

  • Возможно ли всегда изображение из файла, а не кеш? Таким образом, проблема будет решена.

  • Можно ли очистить изображение из кеша, прежде чем получать новое замеченное изображение? Это также решит проблему.

4b9b3361

Ответ 1

Вот как я решил эту проблему.

Способ 1. Когда URL изменяется при изменении изображения

Glide.with(DemoActivity.this)
    .load(Uri.parse("file://" + imagePath))
    .diskCacheStrategy(DiskCacheStrategy.NONE)
    .skipMemoryCache(true)
    .into(mImage);

diskCacheStrategy() может использоваться для обработки кэша диска, и вы можете пропустить кеш памяти с помощью метода skipMemoryCache().

Способ 2. Если URL не изменяется, изменения изображения

Если ваш URL-адрес остается постоянным, вам необходимо использовать подпись для кэша изображений.

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

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

  • Вы можете использовать MediaStoreSignature, если вы загружаете контент из хранилища. MediaStoreSignature позволяет смешивать время изменения времени, тип mime и ориентацию элемента хранилища мультимедиа в ключе кеша. Эти три атрибута надежно перехватывают изменения и обновления, позволяя вам кэшировать большие файлы мультимедиа.
  • Вы можете StringSignature, а также для содержимого, сохраненного в виде файлов, для смешивания времени изменения даты файла.

Ответ 2

Как объяснено в разделе Кэширование и кэш-аннулирование в Glide wiki:

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

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

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

Если вы хотите перезагружать каждый раз изображение с диска, вы можете изменить свой код следующим образом:

Glide.with(DemoActivity.this)
     .load(Uri.parse("file://" + imagePath))
     .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
     .into(mImage);

Ответ 3

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

new Thread(new Runnable() {
          @Override
          public void run() {
             Glide.get(MainActivity.this).clearDiskCache();
          }
     }).start();

Ответ 4

Существует два способа обновления кэша Glide:

Firstway: - Добавьте ниже с реализацией скольжения

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

Второй способ:

Если вы можете определить изменения в изображении, укажите новое имя файла ниже,

.signature(new StringSignature(String.valueOf(fileName)))

или вы хотите загружать каждый раз последние изображения, используйте ниже

.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))

Надеюсь это поможет.

Ответ 5

Если проблемы с Glide 4.2.0, StringSignature не были устранены.

Похоже, StringSignature больше не доступен, и вместо этого вы должны использовать ObjectKey.

Таким образом, код выглядит как

Glide.with(imageView).
load(pathToImage).
apply(new RequestOptions().signature(new ObjectKey("signature string"))).
into(imageView);

Ответ 6

Если вы сохраняете изображения в том же известном имени файла, что и соглашение, и хотите отменить кеш Glide только тогда, когда файл был изменен, использование метки времени изменения файла может работать хорошо.

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

Итак, я использовал стратегию StringSignature со значением файла lastChanged timestamp в качестве подписи. Вот какой, по-видимому, быстрый код для этого:

Glide.with(this)
        .load(avatarFile)
        .diskCacheStrategy(DiskCacheStrategy.RESULT)
        .signature(new StringSignature(String.valueOf(avatarFile.lastModified())))
        .into(ivProfile);
}

где avatarFile - мой java.io.File объект, конечно.

Ответ 7

У меня были проблемы с установкой подписи с использованием Glide версии 4. * с Kotlin. Через некоторое время я закончил с этим:

fun ImageView.loadUrl(url: String) {
    var requestOptions = RequestOptions()
    requestOptions.signature(ObjectKey(System.currentTimeMillis()))
    Glide.with(this).load(url).apply(requestOptions).into(this)
}

Это функция расширения для ImageView и используется следующим образом:

 imageView.loadUrl(url)

Надеюсь, что это поможет кому-то

Ответ 8

Для библиотеки Glide 4.3. + вам нужно что-то вроде этого,

Glide.with(context)
    .load(image_path)
    .apply(new RequestOptions()
                        .diskCacheStrategy(DiskCacheStrategy.NONE)
                        .skipMemoryCache(true))
    .into(imge_view);

Ответ 9

В последних версиях мы должны использовать RequestOptions

RequestOptions Предоставляет независимые от типа параметры для настройки загрузки с Glide в последних версиях Glide.

Создайте объект RequestOptions и используйте его при загрузке изображения.

 RequestOptions requestOptions = new RequestOptions()
                        .diskCacheStrategy(DiskCacheStrategy.NONE) // because file name is always same
                        .skipMemoryCache(true);

 Glide.with(this)
           .load(photoUrl)
           .apply(requestOptions)
           .into(profile_image);

Ответ 10

с GlideApp

    GlideApp.with(imageView)
            .load(url)
            .signature(new ObjectKey(System.currentTimeMillis()))
            .placeholder(R.drawable.sky)
            .error(R.drawable.sky)
            .into(imageView);

Ответ 11

Это сработало для меня

  //use  diskCacheStrategy(DiskCacheStrategy.NONE) after skipMemoryCache(true) 
         Glide.with(this)
            .load(image)
            .skipMemoryCache(true) 
            .diskCacheStrategy(DiskCacheStrategy.NONE)
            .into(imageview);

Ответ 12

И, наконец, реализация Kotlin (для фрагментов):

Glide.with(activity)
            .load(url)
            .apply(RequestOptions()
                    .diskCacheStrategy(DiskCacheStrategy.NONE)
                    .skipMemoryCache(true))
            .into(myImageView)

Ответ 13

Чтобы извлечь выгоду из кеша, предоставленного Glide, и убедиться, что правильное изображение отображается каждый раз, вы можете использовать подпись() API.

Все, что вам нужно сделать, это установить в качестве сигнатуры информацию, относящуюся к файлу изображения. Когда вы заменяете этот файл, информация меняется тоже, и Glide знает, что он должен перезагрузить его, игнорируя кеш. Действительной информацией может быть дайджест (например, SHA-1), рассчитанный на содержимое файла.

Glide.with(context)
   .load(inputFile)
   .signature(new StringSignature(sha1(inputFile)))
   .into(targetImageView);

Здесь я нашел следующую реализацию функции sha1():

public static String sha1(final File file) throws NoSuchAlgorithmException, IOException {
   final MessageDigest messageDigest = MessageDigest.getInstance("SHA1");

   try (InputStream is = new BufferedInputStream(new FileInputStream(file)) {
     final byte[] buffer = new byte[1024];
     for (int read = 0; (read = is.read(buffer)) != -1;) {
       messageDigest.update(buffer, 0, read);
     }
   }

   // Convert the byte to hex format
   try (Formatter formatter = new Formatter()) {
     for (final byte b : messageDigest.digest()) {
       formatter.format("%02x", b);
     }
     return formatter.toString();
   }
}

Ответ 14

Этот работал для меня!

Glide.with(DemoActivity.this)
    .load(Uri.parse("file://" + imagePath))
    .diskCacheStrategy(DiskCacheStrategy.NONE)
    .skipMemoryCache(true)
    .into(mImage);

Ответ 15

Я использовал Glide для загрузки File, и вот что я в итоге сделал, чтобы гарантировать, что кэш Glide на диске был аннулирован каждый раз, когда мой файл изменялся (даже если он имел тот же путь):

Glide.with(context)
    .load(bitmapFile)
    .signature(new ObjectKey(bitmapFile.lastModified()))
    .into(imageView);

Ответ 16

Simply you can use programmetically,

 **Glide.get(getApplicationContext()).clearMemory();
 Glide.get(getApplicationContext()).clearDiskCache();**

[For more][1]'enter code here'

  [1]: https://bumptech.github.io/glide/doc/caching.html