Ответ 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);
У меня есть тот же 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 попытки изменить изображение
//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);
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);
Это старый вопрос, поэтому я уверен, что вы уже получили исправление. Однако я считаю, что обе большие библиотеки (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.
Удачи!
В моем случае 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)
Когда ваша картинка загружается в первый раз, она хранится локально в так называемой кешированной памяти (или просто в кеше). Когда вы запрашиваете его во второй раз, 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 здесь.
Когда новые изображения загружаются или обновляются, используйте ниже, чтобы очистить память и кеш-память и :
| == | 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();
}
Теперь 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);
как будто проблема связана с самой библиотекой 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 перезагружать изображение каждый раз, когда вы запрашиваете, как будто нет никакого кеша для чтения.
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);