not libreria glide found example diskcachestrategy developer cache android caching android-glide

libreria - glide v4 android



Eliminar imagen de caché en la biblioteca Glide (14)

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

A continuación se muestra 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 se muestra en ImageView . Debido a esto, Glide estaba mostrando la primera imagen del 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 del archivo y no el caché? De esta manera se resolverá el problema.

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


¡Este me funcionó!

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


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 la memoria caché del disco y puede omitir la memoria caché utilizando 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 Firma para el 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 de la tienda de medios. MediaStoreSignature permite mezclar la hora de la fecha de modificación, el tipo MIME y la orientación de un elemento del almacén de medios en la clave de caché. Estos tres atributos capturan ediciones y actualizaciones de manera confiable, lo que le permite almacenar en caché los pulgares del almacén de medios.
  • También puede StringSignature para el contenido guardado como Archivos para mezclar la hora de modificación de la fecha del archivo.

Como se explica en la sección Almacenamiento en caché e invalidación de caché de la wiki de Glide:

Debido a que los nombres de archivo son claves hash, no hay una buena manera de eliminar simplemente todos los archivos en caché en el disco que corresponden a una URL o ruta de archivo en particular. 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 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 difícil.

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

Dado que no puede cambiar la ruta del archivo, Glide ofrece la API de signature() que le permite configurar algunos datos adicionales para mezclarlos en la memoria y las claves de caché de disco, lo que permite al llamante tener más control sobre cuándo se invalidan los datos 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);


En las últimas versiones debemos usar RequestOptions

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

Haga un objeto RequestOptions y úselo cuando estemos cargando 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);


Esto eliminará la memoria caché que Glide almacena, y debe hacerse en segundo plano, de lo contrario arrojará 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 de la memoria caché de Glide ,

Primero: - Agregue a continuación con implementación de planeo

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

Segunda forma:

Si puede identificar cambios en la imagen, proporcione su nuevo nombre de archivo a continuación,

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

o desea cargar cada vez con las últimas imágenes, use a continuación

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

Espero que esto ayude.


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

Todo lo que tiene que hacer es establecer como firma una información relacionada 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);

Here 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(); } }


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


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

Estaba usando tal convención para las imágenes de avatar que estaba descargando a los objetos de File fuera de Glide, y luego usando Glide solo para cambiar el tamaño de manera eficiente y hacerlas redondas, etc.

Así que terminé usando la estrategia StringSignature con el valor de la marca de tiempo lastChanged del archivo como firma. Así es como se ve el código fluido para eso:

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 para configurar la firma usando 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


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

Parece que StringSignature ya no está disponible y debe 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);


Y finalmente, la implementación de Kotlin (para fragmentos):

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


firma con GlideApp

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


Esto funciono para mi

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