Estoy usando Picasso para mostrar la imagen en mi aplicación de Android:
/**
* load image.This is within a activity so this context is activity
*/
public void loadImage (){
Picasso picasso = Picasso.with(this);
picasso.setDebugging(true);
picasso.load(quiz.getImageUrl()).into(quizImage);
}
He habilitado la depuración y siempre muestra rojo y verde. Pero nunca muestra amarillo
Ahora, si cargo la misma imagen la próxima vez e Internet no está disponible, la imagen no se carga.
Preguntas:
- ¿No tiene caché de disco local?
- ¿Cómo habilito el almacenamiento en caché del disco ya que usaré la misma imagen varias veces?
- ¿Necesito agregar algún permiso de disco al archivo de manifiesto de Android?
Respuestas:
Esto es lo que hice. Funciona bien.
Primero agregue OkHttp al archivo de compilación gradle del módulo de la aplicación:
Luego haz una clase ampliando
Application
agréguelo al archivo de manifiesto de la siguiente manera:
Ahora use Picasso como lo haría normalmente. Sin cambios.
EDITAR:
si solo desea utilizar imágenes almacenadas en caché. Llame a la biblioteca así. He notado que si no agregamos la política de red, las imágenes no se mostrarán en un inicio completamente fuera de línea, incluso si están almacenadas en caché . El siguiente código resuelve el problema.
EDITAR # 2
El problema con el código anterior es que si borras la memoria caché, Picasso seguirá buscándola sin conexión en la memoria caché y fallará, el siguiente ejemplo de código examina la memoria caché local, si no se encuentra fuera de línea, se conecta y repone la memoria caché.
fuente
okhttp3.OkHttpClient
biblioteca, debe usar elOkHttp3Downloader
formulario de clasecompile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
1) respuesta a la primera pregunta: según Picasso Doc para el método With ()
Pero
Disk Cache
operación para Picasso predeterminado global solo está disponible en API 14+2) respuesta de la segunda pregunta:
Picasso
use laHTTP
solicitud del cliente paraDisk Cache
operar para que pueda hacer su propiahttp request header
propiedadCache-Control
conmax-age
Y cree su propia Instancia de Picasso estática en lugar de la Picasso predeterminada Usando1] HttpResponseCache (Nota: funciona solo para API 13+)
2] OkHttpClient (funciona para todas las API)
Ejemplo de uso
OkHttpClient
para crear su propia clase Static Picasso:Primero crea una nueva clase para obtener tu propio
picasso
objeto singletonusa tu propio
picasso
objeto singleton en lugar dePicasso.With()
PicassoCache.getPicassoInstance(getContext()).load(imagePath).into(imageView)
3) respuesta a la tercera pregunta: no necesita ningún permiso de disco para las operaciones de caché de disco
Referencias : problema de Github sobre la caché de disco , dos preguntas han sido respondidas por @ jake-wharton -> Pregunta1 y Pregunta2
fuente
FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.squareup.okhttp.OkHttpClient
okhttp
Para el almacenamiento en caché, usaría interceptores OkHttp para obtener control sobre la política de almacenamiento en caché. Consulte este ejemplo que se incluye en la biblioteca OkHttp.
RewriteResponseCacheControl.java
Así es como lo usaría con Picasso:
fuente
Para la versión más actualizada 2.71828 Éstas son su respuesta.
P1 : ¿No tiene caché de disco local?
R1 : Hay almacenamiento en caché predeterminado dentro de Picasso y el flujo de solicitud es como este
Donde sea que encuentren su imagen primero, usarán esa imagen y luego detendrán el flujo de solicitudes. ¿Qué pasa con el flujo de respuesta? No se preocupe, aquí está.
De forma predeterminada, se almacenarán primero en un disco local para la caché de mantenimiento extendida. Luego, la memoria, para el uso de instancia de la caché.
Puede usar el indicador incorporado en Picasso para ver dónde se forman las imágenes habilitando esto.
Aparecerá una bandera en la esquina superior izquierda de sus imágenes.
P2 : ¿Cómo habilito el almacenamiento en caché de disco si usaré la misma imagen varias veces?
A2 : No es necesario que lo habilite. Es el predeterminado.
Lo que tendrá que hacer es DESACTIVARLO cuando desee que sus imágenes estén siempre frescas. Hay 2 vías de almacenamiento en caché deshabilitado.
.memoryPolicy()
a no_cache y / o NO_STORE y el flujo se verá así.NO_CACHE omitirá la búsqueda de imágenes de la memoria.
NO_STORE omitirá almacenar imágenes en la memoria cuando las imágenes se carguen por primera vez.
.networkPolicy()
a no_cache y / o NO_STORE y el flujo se verá así.NO_CACHE omitirá la búsqueda de imágenes del disco.
NO_STORE omitirá almacenar imágenes en el disco cuando la primera carga de imágenes.
No puede DESACTIVAR ninguno de los dos para las imágenes sin almacenamiento en caché. Aquí hay un ejemplo.
El flujo sin almacenamiento en caché completo y sin almacenamiento se verá así.
Por lo tanto, es posible que también lo necesite para minimizar el uso de almacenamiento de su aplicación.
P3 : ¿Necesito agregar algún permiso de disco al archivo de manifiesto de Android?
A3 : No, pero no olvide agregar el permiso de INTERNET para su solicitud HTTP.
fuente
1) Picasso por defecto tiene caché (ver la respuesta de ahmed hamdy)
2) Si realmente debe tomar una imagen de la memoria caché del disco y luego de la red, le recomiendo que escriba su propio descargador:
Y en Application singleton en el método OnCreate úselo con picasso:
3) No se necesitan permisos para defalut la carpeta de caché de la aplicación
fuente
Agregue el siguiente código y
Application.onCreate
luego úselo normalmenteSi primero almacena imágenes en caché, haga algo como esto en
ProductImageDownloader.doBackground
y cargue sus imágenes como de costumbre o con caché de disco
Nota:
El color rojo indica que la imagen se obtiene de la red .
El color verde indica que la imagen se obtiene de la memoria caché .
El color azul indica que la imagen se obtuvo de la memoria del disco .
Antes de lanzar la aplicación, elimínela o configúrela
false
picasso.setLoggingEnabled(true);
,picasso.setIndicatorsEnabled(true);
si no es necesario. Thankxfuente
No sé qué tan buena es esa solución, pero definitivamente es LA FÁCIL que acabo de usar en mi aplicación y está funcionando bien
cargas la imagen así
Puedes conseguir algo
bimap
asíAhora
Bitmap
convierta eso en unJPG
archivo y guárdelo en el caché, a continuación se muestra el código completo para obtener el bimap y almacenarlo en cachéel
get()
método dePiccasso
por alguna razón necesitaba ser llamado en un hilo separado, estoy guardando esa imagen también en ese mismo hilo.Una vez que se guarda la imagen, puede obtener todos los archivos así
ahora puede encontrar el archivo que busca como a continuación
fuente
Utilicé este código y funcionó, tal vez sea útil para ti:
fuente
Tuve el mismo problema y usé la biblioteca Glide en su lugar. La caché está lista para usar. https://github.com/bumptech/glide
fuente