私は同じ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);
インターネットを変更することでこのバグを再現できます
//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);
グライド4.x
Glide.with(context)
.load(imageUrl)
.apply(RequestOptions.skipMemoryCacheOf(true))
.apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE))
.into(imageView);
グライド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を呼び出してから、それを実行するために後続の呼び出しを行う必要があるようです。
または、ETagを調べます。
がんばろう!
画像が初めてロードされると、キャッシュメモリ(または単にキャッシュ)と呼ばれる場所にローカルに保存されます。 2回目にリクエストすると、Glideはキャッシュからifを取得し、リクエストが成功したかのように取得します。
これは、サーバーのオフロード、ユーザーへのデータの保存、迅速な応答によるスムーズなユーザーエクスペリエンスの提供など、多くの正当な理由によるものです。
さて、あなたの問題について。キャッシュを無効にして、要求するたびに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);
_
または、各画像に一意の署名を使用します。 (Kinda hacky、トリックをします)
_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キャッシングAPI ここ 。
私の場合、Glideは.signature()
を認識しないため、@ MGDaviesの answer に加えて、このようなものが必要になる場合があります
// 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.get(getApplicationContext()).clearMemory();
| == |グライドキャッシュをクリア()
void clearGlideDiskCache()
{
new Thread(new Runnable()
{
@Override
public void run()
{
Glide.get(getApplicationContext()).clearDiskCache();
}
}).start();
}
最新のスライドバージョン、キャッシュをクリアするにはRequestOption
を使用する必要があります。
RequestOptions options = new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true);
または、画像を読み込むたびに、signature
としてStringを使用する必要があります。
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が画像をリロードするようになります。