wake-up-neo.com

Bild aus dem Cache in der Glide-Bibliothek entfernen

Ich benutze Glide in einem meiner Projekte, um ein Bild aus einer Datei anzuzeigen.

Unten ist mein Code, wie ich das Bild zeige:

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

Das Bild an dieser Stelle (imagePath) ändert sich ständig. Standardmäßig speichert Glide das in ImageView angezeigte Bild. Aus diesem Grund zeigte der Glide das erste Bild für neue Bilder an diesem Ort aus dem Cache.

Wenn ich das Bild am Ort imagePath mit einem anderen Bild mit demselben Namen ändere, zeigt Glide das erste Bild anstelle eines neuen Bildes.

Zwei Fragen sind:

  1. Ist es möglich, das Bild immer aus Datei und nicht zwischenzuspeichern? Dieses Problem wird gelöst.

  2. Ist es möglich, ein Bild aus dem Cache zu löschen, bevor ein neu ersetztes Bild angezeigt wird? Dies löst auch das Problem.

39
Nitesh Khatri

So habe ich dieses Problem gelöst.

Methode 1: Wenn sich die URL ändert, wenn sich das Bild ändert

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

diskCacheStrategy () kann verwendet werden, um den Datenträgercache zu handhaben, und Sie können den Speichercache mit der Methode skipMemoryCache () überspringen.

Methode 2: Wenn sich die URL nicht ändert, ändert sich jedoch das Bild

Wenn Ihre URL konstant bleibt, müssen Sie Signatur für den Bildcache verwenden.

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

Glide Signature () bietet Ihnen die Möglichkeit, zusätzliche Daten mit dem Cache-Schlüssel zu mischen.

  • Sie können MediaStoreSignature verwenden, wenn Sie Inhalte aus dem Media Store abrufen. Mit MediaStoreSignature können Sie die Datumsänderungszeit, den Mimetyp und die Ausrichtung eines Medienspeicherelements in den Cache-Schlüssel mischen. Diese drei Attribute fangen Bearbeitungen und Aktualisierungen zuverlässig ab, sodass Sie die Miniaturbilder des Medienspeichers zwischenspeichern können.
  • Sie können auch StringSignature für Inhalte verwenden, die als Dateien gespeichert sind, um die Änderungszeit der Datei zu mischen.
105
Nitesh Khatri

Wie im Abschnitt Caching und Cache Invalidation des Glide-Wikis erläutert:

Da Dateinamen Hash-Schlüssel sind, gibt es keine gute Möglichkeit, Löschen Sie alle zwischengespeicherten Dateien auf der Festplatte, die einem bestimmten .__ entsprechen. URL oder Dateipfad. Das Problem wäre einfacher, wenn Sie nur .__ wären. darf das Originalbild laden oder zwischenspeichern, da Glide jedoch auch speichert Thumbnails und bietet verschiedene Transformationen, von denen jede führt dazu, dass eine neue Datei im Cache gespeichert wird Jede zwischengespeicherte Version eines Bildes ist schwierig.

In der Praxis besteht der beste Weg zum Ungültigmachen einer Cache-Datei darin, Ihre> Kennung zu ändern, wenn sich der Inhalt ändert (URL, URI, Dateipfad usw.).

Da Sie den Dateipfad nicht ändern können, bietet Glide die API signature () an, mit der Sie zusätzliche Daten in den Speicher und in den Cache-Schlüssel des Datenträgers einmischen können, sodass der Aufrufer mehr Kontrolle darüber erhält, wann zwischengespeicherte Daten ungültig gemacht werden .

Wenn Sie das Image jedes Mal von der Festplatte neu laden möchten, können Sie Ihren Code folgendermaßen ändern:

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

Dadurch wird der von Glide gespeicherte Cache-Speicher entfernt. Und dies sollte im Hintergrund erfolgen, andernfalls wird eine Ausnahme ausgelöst

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

Es gibt zwei Möglichkeiten, mit Glide Cache-Aktualisierung zu arbeiten, 

Firstway: - Füge unten mit gleitender Implementierung hinzu

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

Zweiter Weg:  

Wenn Sie Bildänderungen erkennen können, geben Sie unten Ihren neuen Dateinamen ein.

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

oder Sie möchten jedes Mal mit den neuesten Bildern laden, verwenden Sie unten

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

Hoffe das hilft.

18
Chandrahasan

Wenn Sie Bilder unter demselben Namen wie eine Konvention speichern und den Glide-Cache nur dann ungültig machen möchten, wenn sich die Datei geändert hat, kann die Verwendung des Zeitstempels für die Dateiänderung gut funktionieren.

Ich habe eine solche Konvention für Avatar-Bilder verwendet, die ich für File-Objekte außerhalb von Glide heruntergeladen habe, und dann Glide verwendet, um die Größe zu ändern und sie rund zu machen usw.

Am Ende verwendete ich die StringSignature-Strategie mit dem Wert des lastChanged-Zeitstempels der Datei als Signatur. So sieht der fließende Code dafür aus:

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

dabei ist avatarFile natürlich mein Java.io.File-Objekt.

15
Dhiraj Gupta

Hatte Probleme mit Glide 4.2.0, wurde StringSignature nicht behoben.

Sieht so aus, als wäre StringSignature nicht mehr verfügbar und Sie müssen stattdessen ObjectKey verwenden.

So sieht der Code aus

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

Für Glide 4.3. + -Bibliothek müssen Sie so etwas tun,

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

Ich hatte Probleme mit der Einstellung der Signatur mit Glide Version 4. * mit Kotlin . Nach einiger Zeit endete ich damit: 

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

Es ist eine Erweiterungsfunktion für ImageView und wird auf folgende Weise verwendet:

 imageView.loadUrl(url)

Ich hoffe es hilft jemandem

9
Palejandro

In den neuesten Versionen sollten wir RequestOptions verwenden

RequestOptions Bietet typunabhängige Optionen zum Anpassen von Lasten mit Glide in den neuesten Versionen von Glide.

Erstellen Sie ein RequestOptions-Objekt und verwenden Sie es, wenn Sie das Bild laden.

 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

unterschrift mit GlideApp 

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

Und schließlich die Kotlin-Implementierung (für Fragmente):

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

Das hat für mich funktioniert

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

Um von dem von Glide bereitgestellten Cache zu profitieren und sicherzustellen, dass jedes Mal das richtige Bild angezeigt wird, können Sie die signature () - API verwenden. 

Alles, was Sie tun müssen, ist, eine Information, die sich auf die Bilddatei bezieht, als Signatur festzulegen. Wenn Sie die Datei ersetzen, ändert sich auch die Information und Glide weiß, dass sie die Datei neu laden muss, wobei der Cache ignoriert wird.

Eine gültige Information könnte ein Digest (zum Beispiel SHA-1) sein, der anhand des Dateiinhalts berechnet wird.

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

Here Ich habe folgende Implementierung der Funktion sha1 () gefunden:

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

Ich habe Glide verwendet, um ein File zu laden, und am Ende habe ich Folgendes getan, um sicherzustellen, dass der Festplatten-Cache von Glide bei jeder Änderung meiner Datei ungültig wurde (obwohl er denselben Pfad hatte):

Glide.with(context)
    .load(bitmapFile)
    .signature(new ObjectKey(bitmapFile.lastModified()))
    .into(imageView);
0
Adam Johns

Dieser hat für mich gearbeitet!

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