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:
Ist es möglich, das Bild immer aus Datei und nicht zwischenzuspeichern? Dieses Problem wird gelöst.
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.
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.
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.StringSignature
für Inhalte verwenden, die als Dateien gespeichert sind, um die Änderungszeit der Datei zu mischen.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);
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();
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.
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.
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);
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);
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
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);
unterschrift mit GlideApp
GlideApp.with(imageView)
.load(url)
.signature(new ObjectKey(System.currentTimeMillis()))
.placeholder(R.drawable.sky)
.error(R.drawable.sky)
.into(imageView);
Und schließlich die Kotlin-Implementierung (für Fragmente):
Glide.with(activity)
.load(url)
.apply(RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true))
.into(myImageView)
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);
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();
}
}
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);
Dieser hat für mich gearbeitet!
Glide.with(DemoActivity.this)
.load(Uri.parse("file://" + imagePath))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(mImage);