web-dev-qa-db-ja.com

Glideが画像を更新していませんAndroid?

私は同じ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);

インターネットを変更することでこのバグを再現できます

21
Usman Saeed
//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);
23
jessica

グライド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);
19
steven0529

これは古い質問ですので、今までに修正されたと思います。ただし、両方の大きなライブラリ(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を調べます。

がんばろう!

6
MGDavies

画像が初めてロードされると、キャッシュメモリ(または単にキャッシュ)と呼ばれる場所にローカルに保存されます。 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 ここ

5
Anix PasBesoin

私の場合、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)
5
Abner Escócio

新しい画像がロードまたは更新されたら、以下を使用してGlideメモリとキャッシュをクリアします

| == |グライドメモリをクリア

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

| == |グライドキャッシュをクリア()

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

最新のスライドバージョン、キャッシュをクリアするには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);
3
Hasib Akter

問題は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が画像をリロードするようになります。

0