Jak słuchać, czy Picasso (Android) ładuje kompletne zdarzenia?

92

Czy istnieje sposób, aby nasłuchiwać wydarzeń z Picassa podczas korzystania z konstruktora, takiego jak:

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

Próbuję zadzwonić requestLayout()i invalidate()na rodzica GridViewwięc jej rozmiar prawidłowo, ale nie wiem jak ustawić słuchacza lub callback.

Widzę, że Picasso ma raportowanie zdarzeń błędów, ale czy istnieje zdarzenie sukcesu?

Keith
źródło

Odpowiedzi:

272

Możesz użyć, Callbackaby uzyskać zdarzenia onSuccess i onError. Po prostu dodaj nowe oddzwonienie do swojego żądania, w ten sposób:

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

                        }

                        @Override
                        public void onError() {

                        }
                    });

Następnie możesz wprowadzać wszelkie zmiany i modyfikacje w wywołaniu zwrotnym onSuccess.

MrEngineer13
źródło
1
Jak wyświetlić obraz błędu po wykonaniu onError ()?
Jas
2
Służy .error(R.drawable.error_placeholder_image)do ustawiania obrazu błędu
Raptor
Jak mogę uzyskać dostęp do kontekstu „tego” od wewnątrz onSuccess? Muszę zaktualizować niektóre zmienne w kontekście „tego”, a także jak mogę uzyskać dostęp do imageView wewnątrz wywołania zwrotnego? Dzięki
sonoluminescencja
2
Spróbuj tego YourClassName.this.yourVariable @sonoluminescence
Sofiane Hassaini
1
Jak by to wyglądało w Kotlinie?
Dan2899,
31

Jeśli potrzebujesz uzyskać dostęp do mapy bitowej przed jej załadowaniem do widoku, spróbuj użyć:

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

W metodzie wywołania:

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

Idealnie byłoby zaimplementować Target bezpośrednio na widoku lub obiekcie posiadacza widoku.

Mam nadzieję że to pomoże

Androidme
źródło
gdzie jest imgView?
Noor Hossain
@NoorHossain ustawia bitmapę obrazu po załadowaniu mapy bitowej
famfamfam
6

Odpowiadając na pytanie uzupełniające @Jas jako komentarz do odpowiedzi MrEngineer13 (ponieważ nie mam wystarczającej reputacji, aby komentować w żadnej odpowiedzi), powinieneś użyć error()metody przed zarejestrowaniem metody Callbackat into(), na przykład:

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
źródło
6

Square ostatnio zaktualizowało klasę Target i teraz jest więcej metod do przesłonięcia ( onPrepareLoadi 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) {

    }
};

I nadal musisz używać:

Picasso.with(context).load(url).into(target);
Mateusz Pryczkowski
źródło
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
źródło
0

Spróbuj tego

       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
źródło
0

Jako uzupełnienie innych odpowiedzi, jeśli nie wiesz, gdzie użyć oryginalnego widoku obrazu, np . ImageView myIV:

Oryginał:

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

Nowy (wewnątrz onBitmapLoaded()z new Target()):

public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    myIV.setImageBitmap(bitmap);
}
Owoc
źródło