Glide не обновляет изображение андроида того же url?

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

Glide.with(context)
        .load(Constants.COPY_LINK_BASE_URL + info.getDisplayPicture())
        .placeholder(R.drawable.ic_profile).dontAnimate()
        .diskCacheStrategy(DiskCacheStrategy.SOURCE)
        .signature(new (SettingManager.getUserPictureVersion(context)))
        .into(ivUserProfilePhoto);

Я могу воспроизвести эту ошибку, изменив интернет, на одном интернете изменив изображение, как и ожидалось в другом Интернете, оно останется таким же после того, как 2 или 3 попытки изменить изображение

Ответ 1

//Use bellow code, it work for me.Set skip Memory Cache to true. it will load the image every time.

 Glide.with(Activity.this)
.load(theImagePath)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(myImageViewPhoto);

Ответ 2

Glide 4.x

Glide.with(context)
     .load(imageUrl)
     .apply(RequestOptions.skipMemoryCacheOf(true))
     .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE))
     .into(imageView);

Glide 3.x

Glide.with(context)
     .load(imageUrl)
     .skipMemoryCache(true)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

Ответ 3

Это старый вопрос, поэтому я уверен, что вы уже получили исправление. Однако я считаю, что обе большие библиотеки (Picasso и Glide) теперь поддерживают нечто подобное.

Glide имеет подписной API, который вы можете посмотреть на: https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation

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

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

Кроме того, посмотрите на ETags.

Удачи!

Ответ 4

В моем случае Glide не распознает .signature(), поэтому в дополнение к ответу @MGDavies вам может понадобиться что-то подобное

// in kotlin
Glide.with(context)
        .load("url")
        //using apply to RequestOptions instead signature directly
        .apply(RequestOptions().signature(ObjectKey("time that image was updated")))
        .into(thumb)

Ответ 5

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

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

Теперь по поводу вашей проблемы. Вам необходимо отключить кэш, чтобы Glide получал ваше изображение удаленно при каждом запросе. Просто сделайте следующее:

Glide.with(context)
         .load(Constants.COPY_LINK_BASE_URL + info.getDisplayPicture())
         .placeholder(R.drawable.ic_profile).dontAnimate()
         .diskCacheStrategy(DiskCacheStrategy.NONE)
         .skipMemoryCache(true)
         .signature(new (SettingManager.getUserPictureVersion(context)))
         .into(ivUserProfilePhoto);

Или используйте уникальную подпись для каждой картинки. (Вроде хаки, но делает свое дело)

Glide.with(context)
         .load(Constants.COPY_LINK_BASE_URL + info.getDisplayPicture())
         .placeholder(R.drawable.ic_profile).dontAnimate()
         .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
         .into(ivUserProfilePhoto);

Другой простой способ - настроить стратегию кэширования изображений на вашем сервере и использовать .diskCacheStrategy(DiskCacheStrategy.SOURCE).

дальнейшее чтение

Glide caching API здесь.

Ответ 6

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

| == | Clear Glide memory

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

| == | Clear Glide Cache()

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

Ответ 7

Теперь Glide последней версии, вы должны использовать RequestOption для очистки кэша.

RequestOptions options = new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true);

Или для каждой загрузки изображения вы должны использовать строку в качестве signature.

RequestOptions options = new RequestOptions()
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())));

В заключение:

Glide.with(CompressSingleActivity.this)
.applyDefaultRequestOptions(options)
.load(currentFile)
.into(currentImageView);

Ответ 8

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

        Random random = new Random();
        int randomInt = random.nextInt();
        Glide.with(context)
                .applyDefaultRequestOptions(new RequestOptions()
                        .circleCrop().diskCacheStrategy(DiskCacheStrategy.NONE))
                .load(ConstantVars.BaseUrl + userModel.getAvatarURL() + "?" + randomInt)
                .apply(new RequestOptions().error(R.drawable.himart_place_holder))
                .into(imageViewProfile);

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

Ответ 9

Glide 4.8.0

    Glide.with(mContext)
            .asBitmap()
            .load(nopicUrl)
            .apply(RequestOptions.skipMemoryCacheOf(true))
            .apply(RequestOptions.signatureOf(new ObjectKey(String.valueOf(System.currentTimeMillis()))))
            .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.DATA))
            .into(ivImageView);