¿Cómo escuchar eventos completos de carga de Picasso (Android)?

90

¿Hay alguna manera de escuchar los eventos de Picasso cuando se usa el constructor como:

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

Estoy intentando llamar requestLayout()y invalidate()en la matriz GridViewde modo que va a cambiar el tamaño correctamente, pero no sé cómo establecer un oyente o devolución de llamada.

Veo que Picasso tiene informes de eventos de error, pero ¿hay un evento de éxito?

Keith
fuente

Respuestas:

270

Puede usar un Callbackpara obtener eventos onSuccess y onError. Simplemente agregue una nueva devolución de llamada a su solicitud de esta manera:

Picasso.with(getContext())
    .load(url)
    .into(imageView, new com.squareup.picasso.Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {

                        }
                    });

Luego, puede realizar cualquier alteración y modificación en la devolución de llamada de onSuccess.

MrEngineer13
fuente
1
¿Cómo mostrar la imagen de error cuando se ejecuta onError ()?
Jas
2
Úselo .error(R.drawable.error_placeholder_image)para configurar la imagen de error
Raptor
¿Cómo puedo acceder al contexto 'este' desde dentro de onSuccess? Necesito actualizar algunas variables en el contexto 'this', y también ¿cómo puedo acceder a imageView dentro de la devolución de llamada? Thx
sonoluminiscencia
2
Pruebe este YourClassName.this.yourVariable @sonoluminescence
Sofiane Hassaini
1
¿Cómo sería esto en Kotlin?
Dan2899
31

Si necesita acceder al mapa de bits antes de que se cargue en la vista, intente usar:

private Target target = new Target() {
      @Override
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {       
      }
      @Override
      public void onBitmapFailed() {
      }
}

En el método de llamada:

Picasso.with(this).load("url").into(target);

Lo ideal sería implementar Target en una vista o un objeto de titular de vista directamente.

Espero que esto ayude

Androidme
fuente
¿Dónde está el imgView?
Noor Hossain
@NoorHossain establece el mapa de bits de la imagen cuando se carga el mapa de bits
famfamfam
6

Respondiendo a la pregunta de seguimiento de @Jas como un comentario a la respuesta de MrEngineer13 (ya que no tengo suficiente reputación para comentar en ninguna respuesta), debe usar el error()método antes de registrar Callbackel into()método at , por ejemplo:

Picasso.with(getContext())
    .load(url)
    .error(R.drawable.error_placeholder_image)
    .into(imageView, new com.squareup.picasso.Callback() {
        @Override
        public void onSuccess() {
            //Success image already loaded into the view
        }

        @Override
        public void onError() {
            //Error placeholder image already loaded into the view, do further handling of this situation here
        }
    }
);
Guilherme Santos
fuente
6

Square ha actualizado últimamente la clase Target y ahora hay más métodos para anular ( onPrepareLoady onBitmapFailed):

Target target = new Target() {
    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {

    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {

    }
};

Y todavía tienes que usar:

Picasso.with(context).load(url).into(target);
Mateusz Pryczkowski
fuente
3
 private final Callback mImageCallback = new Callback() {
        @Override
        public void onSuccess() {
            startPostponedEnterTransition();
        }

        @Override
        public void onError() {
            startPostponedEnterTransition();
        }
    };

RequestCreator creator = Picasso.with(getActivity()).load(list.get(position).getId());
creator.into(imageView, mImageCallback);
vaibhav jain
fuente
0

Prueba esto

       Picasso.with(context)
            .load(services.get(position).getImageInactive())
            .into(holder.icon, new Callback() {
                @Override
                public void onSuccess() {
                    holder.imageLoad.setVisibility(View.GONE);
                }

                @Override
                public void onError() {
                    holder.icon.setImageResource(R.drawable.ic_error_image_load);
                }
            });
AGTHAMAYS
fuente
0

Como complemento a otras respuestas, en caso de que no sepa dónde usar la vista de imagen original, por ejemplo ImageView myIV:

Original:

Picasso.with(activity).load(url).into(myIV);

Nuevo (dentro onBitmapLoaded()de new Target()):

public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    myIV.setImageBitmap(bitmap);
}
Fruta
fuente