Как прослушивать события завершения загрузки Picasso (Android)?

92

Есть ли способ прослушивать события от Пикассо при использовании конструктора, например:

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

Я пытаюсь позвонить requestLayout()и invalidate()на родителях , GridViewтак что будет правильно изменить размер , но я не знаю , как установить слушатель или обратный вызов.

Я вижу, что у Picasso есть отчет об ошибках, но есть ли успешное событие?

Кит
источник

Ответы:

272

Вы можете использовать a Callbackдля получения событий onSuccess и onError. Просто добавьте в свой запрос новый обратный вызов, например:

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

                        }

                        @Override
                        public void onError() {

                        }
                    });

Затем вы можете вносить любые изменения и модификации в обратный вызов onSuccess.

MrEngineer13
источник
1
Как показать изображение ошибки при выполнении onError () ??
Jas
2
Используйте .error(R.drawable.error_placeholder_image)для установки изображения ошибки
Raptor
Как я могу получить доступ к контексту this изнутри onSuccess? Мне нужно обновить некоторые переменные в контексте this, а также как я могу получить доступ к imageView внутри обратного вызова? Thx
sonoluminescence
2
Попробуйте это YourClassName.this.yourVariable @sonoluminescence
Sofiane Hassaini
1
Как бы это выглядело в Котлине?
Dan2899
31

Если вам нужно получить доступ к растровому изображению до его загрузки в представление, попробуйте использовать:

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

В вызывающем методе:

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

В идеале вы должны реализовать Target непосредственно на представлении или объекте-держателе представления.

Надеюсь это поможет

Androidme
источник
где imgView?
Нур Хоссейн,
@NoorHossain устанавливает растровое изображение при загрузке растрового изображения
famfamfam
6

Отвечая на последующий вопрос @Jas в качестве комментария к ответу MrEngineer13 (поскольку у меня недостаточно репутации, чтобы комментировать какой-либо ответ), вы должны использовать этот error()метод до регистрации Callbackв into()методе, например:

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 недавно обновила класс Target, и теперь есть больше методов для переопределения ( onPrepareLoadи 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) {

    }
};

И вам все равно придется использовать:

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

Попробуй это

       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
источник
0

В дополнение к другим ответам, если вы не знаете, где использовать исходное изображение, например ImageView myIV :

Оригинал:

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

Новый (внутри onBitmapLoaded()из new Target()):

public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    myIV.setImageBitmap(bitmap);
}
Фрукты
источник