Eliminar la imagen de la memoria caché en la biblioteca Glide

Estoy usando Glide en uno de mis proyectos para mostrar la imagen del archivo.

Debajo está mi código de cómo estoy mostrando la imagen:

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

La imagen en esta ubicación ( imagePath ) sigue cambiando. Por defecto, Glide almacena en caché la imagen que muestra en ImageView . Debido a esto, Glide estaba mostrando la primera imagen de la memoria caché para nuevas imágenes en esa ubicación.

Si cambio la imagen en la ubicación imagePath con alguna otra imagen con el mismo nombre, Glide muestra la primera imagen en lugar de la nueva.

Dos consultas son:

  1. ¿Es posible siempre la imagen de archivo y no de caché? De esta manera el problema será resuelto.

  2. ¿Es posible borrar la imagen de la memoria caché antes de obtener una imagen recién reemplazada? Esto también resolverá el problema.

Así es como resolví este problema.

Método 1: cuando la URL cambia cada vez que cambia la imagen

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

diskCacheStrategy () se puede usar para manejar el caché de disco y se puede omitir el caché de memoria usando el método skipMemoryCache ().

Método 2: cuando la URL no cambia, sin embargo, la imagen cambia

Si su URL permanece constante, entonces necesita usar Signature para caché de imágenes.

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

Glide signature () le ofrece la capacidad de mezclar datos adicionales con la clave de caché.

  • Puede usar MediaStoreSignature si va a buscar contenido desde el almacén de medios. MediaStoreSignature permite mezclar la fecha, la hora de modificación, el tipo de mímica y la orientación de un elemento del medio de almacenamiento en la clave de caché. Estos tres atributos capturan de manera confiable ediciones y actualizaciones, lo que le permite almacenar en caché los pulgares de la tienda de medios.
  • También puede StringSignature para el contenido guardado como archivos para mezclar la fecha de modificación de la fecha del archivo.

Como se explica en la sección Invalidación de caché y caché de la wiki de Glide:

Debido a que los nombres de archivo son claves hash, no hay una buena manera de simplemente eliminar todos los archivos almacenados en caché en el disco que corresponden a una url particular o ruta de archivo. El problema sería más simple si solo se le permitiera cargar o almacenar en caché la imagen original, pero dado que Glide también almacena en la memoria caché las miniaturas y proporciona varias transformaciones, cada una de las cuales dará como resultado un nuevo archivo en el caché, rastreando y eliminando cada versión almacenada en caché de una imagen es dificil

En la práctica, la mejor manera de invalidar un archivo de caché es cambiar su identificador cuando el contenido cambie (url, uri, ruta de archivo, etc.).

Como no puede cambiar la ruta del archivo, Glide ofrece la API signature () que le permite configurar algunos datos adicionales para que se mezclen con la memoria y las claves de la memoria caché de disco, lo que permite al que llama tener más control sobre cuándo se invalida la información en caché.

Si desea volver a cargar cada vez que la imagen del disco, puede cambiar su código de esta manera:

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

Esto eliminará la memoria caché que almacena Glide. Y debe hacerse en segundo plano, de lo contrario generará una excepción.

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

Hay dos formas de manejar la actualización del caché Glide,

Firstway: – Agregue a continuación con la implementación de planeo

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

Segunda forma:

Si puede identificar los cambios de imagen, ingrese su nuevo nombre de archivo a continuación,

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

o si desea cargar cada vez con las últimas imágenes, use debajo

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

Espero que esto ayude.

Si guarda imágenes en el mismo nombre de archivo conocido como una convención y desea invalidar la caché de Glide solo cuando el archivo ha cambiado, usar la marca de tiempo de modificación de archivo puede funcionar bien.

Estaba usando una convención para imágenes de avatar que estaba descargando para File objetos fuera de Glide, y luego uso Glide solo para cambiar el tamaño de manera eficiente y hacerlos redondos, etc.

Así que terminé usando la estrategia StringSignature con el valor de la marca de tiempo LastChanged del archivo como la firma. Este es el código de fluidez que se ve:

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

donde avatarFile es mi objeto java.io.File , por supuesto.

Tuve problemas con Glide 4.2.0, StringSignature no se resolvió.

Parece que StringSignature ya no está disponible y debes usar ObjectKey en ObjectKey lugar.

Entonces el código parece

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

Para la biblioteca Glide 4.3. + Necesitas algo como esto para

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

Tuve problemas para configurar la firma con Glide versión 4. * con Kotlin. Después de un tiempo terminé con esto:

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

Es una función de extensión para ImageView, y se usa de esta manera:

  imageView.loadUrl(url) 

Espero que ayude a alguien

firma con GlideApp

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

Esto funcionó para mí

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

Para beneficiarse de la memoria caché proporcionada por Glide y asegurarse de que se muestre la imagen correcta cada vez, puede usar la API signature () .

Todo lo que tiene que hacer es establecer como firma una información que se relaciona con el archivo de imagen. Cuando reemplaza ese archivo, la información también cambia y Glide sabe que debe volver a cargarlo, ignorando el caché.

Una información válida podría ser un resumen (por ejemplo, SHA-1) calculado sobre el contenido del archivo.

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

Aquí encontré la siguiente implementación de la función 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(); } } 

Y, finalmente, la implementación de Kotlin (For Fragments):

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

En las últimas versiones deberíamos usar RequestOptions

RequestOptions Proporciona opciones de tipo independiente para personalizar cargas con Glide en las últimas versiones de Glide.

Cree un Objeto RequestOptions y úselo cuando carguemos la imagen.

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