Estoy usando el siguiente código para cargar una URL en un ImageView. Primero intenta cargar desde la caché y, si falla, intenta buscarlo de Internet:

Picasso.with(getActivity())
.load(imageUrl)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(imageView, new Callback() {
    @Override
    public void onSuccess() {

    }

    @Override
    public void onError() {
        //Try again online if cache failed
        Picasso.with(getActivity())
                .load(imageUrl)
                .error(R.drawable.error_image)
                .into(imageView, new Callback() {
            @Override
            public void onSuccess() {

            }

            @Override
            public void onError() {
                Log.v("Picasso","Could not fetch image");
            }
        });
    }
});

Funciona bien, pero el problema es que es realmente engorroso escribir todo este código cada vez que tengo que cargar una imagen, en comparación con el estándar:

Picasso.with(getContext())
 .load(imageUrl)
 .into(imageView);

¿Hay alguna forma de encapsular este comportamiento? ¿Picasso proporciona alguna forma de ayudarlo?

0
FlyingPumba 14 dic. 2016 a las 22:17

2 respuestas

La mejor respuesta

El comentario de @ianhanniballake era correcto y esta respuesta SO es engañosa. Para habilitar el almacenamiento en caché, solo tiene que agregar a su Aplicación:

Picasso.Builder builder = new Picasso.Builder(this);
builder.downloader(new OkHttpDownloader(this, Integer.MAX_VALUE));
Picasso.setSingletonInstance(builder.build());

Y luego Picasso / OkHttp se encarga de buscar en el caché antes de intentar cargar una imagen de Internet.

0
Community 23 may. 2017 a las 12:08

intenta usar este código, esto funcionó para mí

esta clase usa una política de reintento para descargar imágenes

public class PicassoHelper {

private static final boolean isDebug = false;
private static final int MAX_RETRY_TIME = 10;         // Default is 3 in Picasso
private static final int MAX_DOWNLOADING_THREAD = 4;  // Recommand in Volley , it is 4
private static Picasso sPicasso;

public static Picasso Pwith(Context context) {
    // Mimicking Picasso's new OkHttpLoader(context), but with our custom OkHttpClient
    if (sPicasso == null) {
        OkHttpClient client = new OkHttpClient();
        client.setRetryOnConnectionFailure(true);
        // Create A Retry Policy
        client.interceptors().add(new Interceptor() {
            @Override
            public Response intercept(Interceptor.Chain chain) throws IOException {
                Request request = chain.request();
                // try the request
                Response response = chain.proceed(request);
                int tryCount = 0;
                while (!response.isSuccessful() && tryCount < MAX_RETRY_TIME) {
                    Log.d("intercept :"," Request is not successful - " + tryCount);
                    tryCount++;
                    // retry the request
                    response = chain.proceed(request);
                }
                // otherwise just pass the original response on
                return response;
            }
        });
        sPicasso = new Picasso.Builder(context)
                .executor(Executors.newFixedThreadPool(MAX_DOWNLOADING_THREAD))
                .downloader(new OkHttpDownloader(client)).build();
        if(isDebug) {
            sPicasso.setIndicatorsEnabled(true);
            sPicasso.setLoggingEnabled(true);
        }
    }
    return sPicasso;
}

}


Ahora, después de crear la clase, es hora de usarla en nuestro código

PicassoHelper.Pwith(application_context).load(image_url).into(imageView);

1
msmukesh4 7 jun. 2017 a las 11:38