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?

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.


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


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
        }
    }
);

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);

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);

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);
                }
            });

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);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.