web-dev-qa-db-fra.com

Supprimer l'image du cache dans la bibliothèque Glide

J'utilise Glide dans l'un de mes projets pour afficher une image à partir d'un fichier.

Ci-dessous mon code comment je montre l'image:

Glide.with(DemoActivity.this)
     .load(Uri.parse("file://" + imagePath))
     .into(mImage);

L'image à cet endroit (imagePath) continue à changer. Par défaut, Glide met en cache l'image affichée dans la variable ImageView. Pour cette raison, le Glide montrait la première image du cache pour les nouvelles images à cet endroit.

Si je change l'image à l'emplacement imagePath avec une autre image portant le même nom, le glissement montre la première image au lieu de la nouvelle.

Deux requêtes sont:

  1. Est-il possible de toujours l'image à partir du fichier et non en cache? De cette façon, le problème sera résolu.

  2. Est-il possible d'effacer l'image du cache avant d'obtenir une image nouvellement remplacée? Cela résoudra également le problème.

39
Nitesh Khatri

Voici comment j'ai résolu ce problème.

Méthode 1: lorsque l'URL change à chaque fois que l'image change

Glide.with(DemoActivity.this)
    .load(Uri.parse("file://" + imagePath))
    .diskCacheStrategy(DiskCacheStrategy.NONE)
    .skipMemoryCache(true)
    .into(mImage);

diskCacheStrategy () peut être utilisé pour gérer le cache disque et vous pouvez ignorer le cache mémoire à l'aide de la méthode skipMemoryCache ().

Méthode 2: lorsque l'URL ne change pas, cependant, l'image change

Si votre URL reste constante, vous devez utiliser Signature pour le cache d'images.

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

Glide signature () vous offre la possibilité de mélanger des données supplémentaires avec la clé de cache.

  • Vous pouvez utiliser MediaStoreSignature si vous extrayez du contenu du magasin de médias. MediaStoreSignature vous permet de mélanger la date, l'heure modifiée, le type mime et l'orientation d'un élément de magasin de supports dans la clé de cache. Ces trois attributs capturent de manière fiable les modifications et les mises à jour, ce qui vous permet de mettre en cache les miniatures des magasins de supports.
  • Vous pouvez aussi StringSignature pour que le contenu enregistré en tant que Fichiers mélange la date de modification du fichier.
105
Nitesh Khatri

Comme expliqué dans la section Invalidation de la mémoire cache et du cache du wiki Glide:

Étant donné que les noms de fichiers sont des clés hachées, il n’existe aucun moyen simple de. supprimer tous les fichiers mis en cache sur le disque qui correspondent à un .__ particulier. URL ou chemin du fichier. Le problème serait plus simple si vous n'étiez que jamais autorisé à charger ou mettre en cache l'image d'origine, mais depuis Glide également met en cache les vignettes et fournit diverses transformations, dont chacune se traduira par un nouveau fichier dans le cache, le suivi et la suppression chaque version en cache d'une image est difficile.

En pratique, le meilleur moyen d'invalider un fichier cache est de changer votre identifiant lorsque le contenu change (url, uri, chemin du fichier, etc.).

Etant donné que vous ne pouvez pas changer le chemin du fichier, Glide propose l’API signature () qui vous permet de définir des données supplémentaires à mélanger dans les clés de mémoire et de cache disque, ce qui permet à l’appelant de mieux contrôler l’invalidation des données en cache .

Si vous voulez recharger chaque fois l'image du disque, vous pouvez changer votre code comme suit:

Glide.with(DemoActivity.this)
     .load(Uri.parse("file://" + imagePath))
     .signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
     .into(mImage);
43
Mattia Maestrini

Cela supprimera la mémoire cache qui est stockée par Glide.Et cela devrait être fait en arrière-plan, sinon une exception

new Thread(new Runnable() {
          @Override
          public void run() {
             Glide.get(MainActivity.this).clearDiskCache();
          }
     }).start();
23
Anand Savjani

Il existe deux façons de gérer Glide cache refresh, 

Firstway: - Ajouter ci-dessous avec la mise en œuvre de la glisse

.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)

Deuxième voie:  

Si vous pouvez identifier les modifications d’image, donnez votre nouveau nom de fichier ci-dessous,

.signature(new StringSignature(String.valueOf(fileName)))

ou vous voulez charger à chaque fois avec les dernières images, utilisez ci-dessous

.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))

J'espère que cela t'aides.

18
Chandrahasan

Si vous enregistrez des images sous le même nom de fichier connu selon une convention et que vous souhaitez invalider le cache Glide uniquement lorsque le fichier a été modifié, l'utilisation de l'horodatage de modification de fichier peut fonctionner correctement.

J'utilisais une telle convention pour les images d'avatar que je téléchargeais pour des objets File situés en dehors de Glide, puis que j'utilisais Glide simplement pour les redimensionner efficacement, etc.

J'ai donc fini par utiliser la stratégie StringSignature avec la valeur de l'horodatage lastChanged du fichier comme signature. Voici à quoi ressemble le code courant pour cela:

Glide.with(this)
        .load(avatarFile)
        .diskCacheStrategy(DiskCacheStrategy.RESULT)
        .signature(new StringSignature(String.valueOf(avatarFile.lastModified())))
        .into(ivProfile);
}

avatarFile est mon objet Java.io.File, bien sûr.

15
Dhiraj Gupta

Si vous aviez des problèmes avec Glide 4.2.0, StringSignature n’a pas été résolu.

On dirait que StringSignature n'est plus disponible et vous devez utiliser ObjectKey à la place.

Donc, le code ressemble à

Glide.with(imageView).
load(pathToImage).
apply(new RequestOptions().signature(new ObjectKey("signature string"))).
into(imageView);
14
DEADMC

Pour la bibliothèque Glide 4.3. +, Vous devez utiliser quelque chose comme ceci:

Glide.with(context)
    .load(image_path)
    .apply(new RequestOptions()
                        .diskCacheStrategy(DiskCacheStrategy.NONE)
                        .skipMemoryCache(true))
    .into(imge_view);
11
Jaydipsinh Zala

J'ai eu des problèmes avec la définition de la signature avec Glide version 4. * avec Kotlin . Après un certain temps, je me suis retrouvé avec ceci: 

fun ImageView.loadUrl(url: String) {
    var requestOptions = RequestOptions()
    requestOptions.signature(ObjectKey(System.currentTimeMillis()))
    Glide.with(this).load(url).apply(requestOptions).into(this)
}

C'est une fonction d'extension pour ImageView, et elle est utilisée de cette façon:

 imageView.loadUrl(url)

J'espère que ça va aider quelqu'un

9
Palejandro

Dans les dernières versions, nous devrions utiliser RequestOptions

RequestOptions Fournit des options indépendantes du type pour personnaliser les charges avec Glide dans les dernières versions de Glide.

Créez un objet RequestOptions et utilisez-le lorsque nous chargeons l'image.

 RequestOptions requestOptions = new RequestOptions()
                        .diskCacheStrategy(DiskCacheStrategy.NONE) // because file name is always same
                        .skipMemoryCache(true);

 Glide.with(this)
           .load(photoUrl)
           .apply(requestOptions)
           .into(profile_image);
6
Vinay John

signature avec GlideApp 

    GlideApp.with(imageView)
            .load(url)
            .signature(new ObjectKey(System.currentTimeMillis()))
            .placeholder(R.drawable.sky)
            .error(R.drawable.sky)
            .into(imageView);
5
Dan Alboteanu

Et enfin, la mise en œuvre de Kotlin (pour les fragments):

Glide.with(activity)
            .load(url)
            .apply(RequestOptions()
                    .diskCacheStrategy(DiskCacheStrategy.NONE)
                    .skipMemoryCache(true))
            .into(myImageView)
4
Eugene Voronoy

Cela a fonctionné pour moi

  //use  diskCacheStrategy(DiskCacheStrategy.NONE) after skipMemoryCache(true) 
         Glide.with(this)
            .load(image)
            .skipMemoryCache(true) 
            .diskCacheStrategy(DiskCacheStrategy.NONE)
            .into(imageview);
4
Shreyas Sanil

Pour tirer parti du cache fourni par Glide et vous assurer que la bonne image est affichée à chaque fois, vous pouvez utiliser l'API signature ()

Tout ce que vous avez à faire est de définir comme signature une information relative au fichier image. Lorsque vous remplacez ce fichier, les informations changent également et Glide sait qu'il doit le recharger, en ignorant le cache.

Une information valide peut être un résumé (par exemple SHA-1) calculé sur le contenu du fichier.

Glide.with(context)
   .load(inputFile)
   .signature(new StringSignature(sha1(inputFile)))
   .into(targetImageView);

Ici j'ai trouvé l'implémentation suivante de la fonction sha1 ():

public static String sha1(final File file) throws NoSuchAlgorithmException, IOException {
   final MessageDigest messageDigest = MessageDigest.getInstance("SHA1");

   try (InputStream is = new BufferedInputStream(new FileInputStream(file)) {
     final byte[] buffer = new byte[1024];
     for (int read = 0; (read = is.read(buffer)) != -1;) {
       messageDigest.update(buffer, 0, read);
     }
   }

   // Convert the byte to hex format
   try (Formatter formatter = new Formatter()) {
     for (final byte b : messageDigest.digest()) {
       formatter.format("%02x", b);
     }
     return formatter.toString();
   }
}
2

Celui-ci a fonctionné pour moi!

Glide.with(DemoActivity.this)
    .load(Uri.parse("file://" + imagePath))
    .diskCacheStrategy(DiskCacheStrategy.NONE)
    .skipMemoryCache(true)
    .into(mImage);
0
Allan Jaqueira