Cargue imágenes de la memoria caché de disco con Picasso si no está conectado

Tengo algunas imágenes que descargo de diferentes sitios web cuando se inicia la aplicación, al hacer esto:

Picasso.with(context).load(image_url).fetch(); 

Ahora, supongamos que el usuario cierra la aplicación y se desconecta. Cuando la aplicación comienza de nuevo, Picasso muestra las imágenes de esta manera:

 Picasso.with(ctx).load(image_url).placeholder(R.drawable.ph).into(imageView); 

El problema es que algunas imágenes se cargan desde el caché de disco (triángulo amarillo en modo de depuración) y para las demás, Picasso muestra el marcador de posición.

¿Por qué? Estoy esperando que cada imagen se cargue desde la memoria caché de disco.

Puede usar este código según esta estrategia. Picasso buscará imágenes en el caché y, si solo falla, la imagen se descargará a través de la red.

  Picasso.with(context) .load(Uri.parse(getItem(position).getStoryBigThumbUrl())) .networkPolicy(NetworkPolicy.OFFLINE) .into(holder.storyBigThumb, new Callback() { @Override public void onSuccess() { } @Override public void onError() { // Try again online if cache failed Picasso.with(context) .load(Uri.parse(getItem(position) .getStoryBigThumbUrl())) .placeholder(R.drawable.user_placeholder) .error(R.drawable.user_placeholder_error) .into(holder.storyBigThumb); } }); 

Hacer esto:

 Picasso.with(this) .load(url) .networkPolicy(NetworkPolicy.OFFLINE) .into(imageView); 

También verifique mi respuesta anterior, tal vez lo ayude: Invalidar el caché en Picasso

Esta lógica funcionó para mí:

 if network is available: Picasso.with(context).load(image).into(imageView); else: Picasso.with(context).load(image).networkPolicy(NetworkPolicy.OFFLINE).into(imageView); 

¿Está OkHttp y Okio en la ruta de clase? (o en sus dependencias) Porque, de forma predeterminada, Picasso permite que el HttpClient maneje el almacenamiento en caché (no lo hace de manera predeterminada)

tienes 2 opciones

  • incluir las dependencias mencionadas (recomendado)
  • especifique el caché manualmente

Para evitar crear una instancia separada de RequestCreator como aquí , haga esto:

  RequestCreator request = mPicasso.load(TextUtils.isEmpty(imageUrl) ? null : imageUrl) .placeholder(R.drawable.ic_default) .error(R.drawable.ic_default) .transform(transformations) .noFade() .centerCrop(); request .networkPolicy(NetworkPolicy.OFFLINE) .into(mImageView, new Callback.EmptyCallback(){ @Override public void onError() { super.onError(); request.into(mImageView); } });