web-dev-qa-db-fra.com

Glide ne met pas à jour l'image Android de la même URL?

J'ai la même URL pour une image. Lorsque je mets à jour cette image plusieurs fois, elle affiche l'image précédente. La version de l'image et de l'image sur le serveur est mise à jour mais Glide n'affiche pas la nouvelle image. Je veux obtenir une nouvelle image à chaque fois et la mettre en cache.

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);

Je peux reproduire ce bug en changeant internet, sur un internet son image change comme prévu sur un autre internet il reste le même après 2 ou 3 essais de changement d'image

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

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);
19
steven0529

C'est une vieille question, donc je suis sûr que vous avez maintenant votre solution. Cependant, je pense que les deux grandes bibliothèques (Picasso et Glide) prennent désormais en charge quelque chose de similaire.

Glide a son API de signature que vous voudrez peut-être examiner: https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation

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

Je n'ai pas eu l'occasion de travailler avec cela moi-même, mais il semble que vous deviez appeler votre API pour obtenir la version Metadata, puis un appel ultérieur pour la remplir.

Vous pouvez également examiner les ETags.

Bonne chance!

6
MGDavies

Lorsque votre image est chargée la première fois, elle est stockée localement dans ce qu'on appelle une mémoire cache (ou simplement un cache). Lorsque vous le demandez une deuxième fois, Glide récupère le contenu du cache comme s'il s'agissait d'une requête réussie.

Cela est dû à de nombreuses bonnes raisons telles que: le déchargement de votre serveur, la sauvegarde de certaines données de vos utilisateurs et leur offrant une expérience utilisateur fluide en répondant rapidement.

Maintenant, concernant votre problème. Vous devez désactiver le cache pour forcer Glide à récupérer votre image à distance chaque fois que vous la demandez. Procédez simplement comme suit:

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);

Ou utilisez une signature unique pour chaque photo. (Un peu hacky mais fait l'affaire)

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);

Une autre façon simple serait de configurer la stratégie de cache de votre image sur votre serveur et d'utiliser .diskCacheStrategy(DiskCacheStrategy.SOURCE).

Lectures complémentaires

API de mise en cache Glide ici .

5
Anix PasBesoin

Je mon cas Glide ne reconnaît pas .signature(), donc en plus de @ MGDavies answer vous avez peut-être besoin de quelque chose comme ça

// 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

Lorsque de nouvelles images sont chargées ou mises à jour, utilisez ci-dessous pour effacer la mémoire Glide et le cache:

| == | Mémoire Clear Glide

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

| == | Vider le cache de glissement ()

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

Maintenant Glide latest version, vous devez utiliser RequestOption pour vider le cache.

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

Ou pour chaque image de chargement, vous devez utiliser un String in signature.

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

Finalement:

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