Como ouvir os eventos completos de carregamento do Picasso (Android)?

90

Existe uma maneira de ouvir eventos de Picasso ao usar o construtor como:

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

Eu estou tentando chamar requestLayout()e invalidate()no pai GridViewpor isso vai redimensionar corretamente, mas eu não sei como definir um ouvinte ou callback.

Vejo que o Picasso tem relatórios de eventos de erro, mas existe um evento de sucesso?

Keith
fonte

Respostas:

270

Você pode usar um Callbackpara obter eventos onSuccess e onError. Basta adicionar um novo retorno de chamada à sua solicitação, como:

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

                        }

                        @Override
                        public void onError() {

                        }
                    });

Então você pode realizar quaisquer alterações e modificações no retorno de chamada onSuccess.

MrEngineer13
fonte
1
Como mostrar a imagem de erro quando onError () é executado ??
Jas
2
Use .error(R.drawable.error_placeholder_image)para definir a imagem de erro
Raptor
Como posso acessar o contexto 'este' de dentro do onSuccess? Eu preciso atualizar algumas variáveis ​​no contexto 'this', e também como posso acessar o imageView dentro do callback? Thx
sonoluminescência
2
Tente este YourClassName.this.yourVariable @sonoluminescence
Sofiane Hassaini
1
Como seria isso em Kotlin?
Dan2899
31

Se você precisar acessar o bitmap antes de carregá-lo na visualização, tente usar:

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

No método de chamada:

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

Idealmente, você implementaria o Target em uma visualização ou objeto de suporte de visualização diretamente.

Espero que isto ajude

Androidme
fonte
onde fica o imgView?
Noor Hossain
@NoorHossain define o bitmap da imagem quando o bitmap é carregado
famfamfam
6

Respondendo a pergunta de acompanhamento @Jas como um comentário à resposta do MrEngineer13 (uma vez que não tenho reputação suficiente para comentar em nenhuma resposta), você deve usar o error()método antes de registrar o Callbackno into()método, por exemplo:

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
fonte
6

Recentemente, o Square atualizou a classe Target e agora existem mais métodos para substituir ( onPrepareLoade 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) {

    }
};

E você ainda precisa usar:

Picasso.with(context).load(url).into(target);
Mateusz Pryczkowski
fonte
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
fonte
0

Tente isto

       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
fonte
0

Como complemento de outras respostas, caso não saiba onde utilizar a visualização da imagem original, por exemplo ImageView myIV:

Original:

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

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

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