Làm thế nào để lắng nghe Picasso (Android) tải các sự kiện hoàn chỉnh?


90

Có cách nào để lắng nghe các sự kiện từ Picasso khi sử dụng trình tạo như:

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

Tôi đang cố gọi requestLayout()và gọi invalidate()cho phụ huynh GridViewđể nó thay đổi kích thước đúng cách nhưng tôi không biết cách đặt người nghe hoặc gọi lại.

Tôi thấy rằng Picasso có báo cáo sự kiện lỗi, nhưng có sự kiện thành công không?

Câu trả lời:


270

Bạn có thể sử dụng a Callbackđể nhận các sự kiện onSuccess và onError. Chỉ cần thêm một Gọi lại mới vào yêu cầu của bạn như sau:

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

                        }

                        @Override
                        public void onError() {

                        }
                    });

Sau đó, bạn có thể thực hiện bất kỳ thay đổi và sửa đổi nào trong lệnh gọi lại onSuccess.


1
Làm thế nào để hiển thị hình ảnh lỗi khi onError () được thực thi ??
Jas

2
Sử dụng .error(R.drawable.error_placeholder_image)để đặt hình ảnh lỗi
Raptor

Làm cách nào để truy cập ngữ cảnh 'this' từ bên trong onSuccess? Tôi cần cập nhật một số biến trong ngữ cảnh 'this' và cả cách tôi có thể truy cập imageView bên trong lệnh gọi lại? Thx
sonoluminescence

2
Hãy thử @sonoluminescence YourClassName.this.yourVariable này
Sofiane Hassaini

1
Điều này sẽ như thế nào trong Kotlin?
Dan2899,

31

Nếu bạn cần truy cập bitmap trước khi nó được tải vào chế độ xem, hãy thử sử dụng:

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

Trong phương thức gọi:

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

Tốt nhất là bạn nên triển khai Target trên một chế độ xem hoặc đối tượng chủ sở hữu chế độ xem trực tiếp.

Hi vọng điêu nay co ich


imgView ở đâu?
Noor Hossain

@NoorHossain đặt bitmap hình ảnh khi bitmap được tải
famfamfam

6

Trả lời câu hỏi tiếp theo của @Jas dưới dạng nhận xét cho câu trả lời của MrEngineer13 (vì tôi không có đủ uy tín để bình luận trong bất kỳ câu trả lời nào), bạn nên sử dụng error()phương pháp trước khi đăng ký Callbacktại into()phương thức, ví dụ:

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 gần đây đã cập nhật lớp Target và bây giờ có nhiều phương thức hơn để ghi đè ( onPrepareLoadonBitmapFailed):

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

    }
};

Và bạn vẫn phải sử dụng:

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

Thử cái này

       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

Để bổ sung cho các câu trả lời khác, trong trường hợp bạn không biết sử dụng chế độ xem hình ảnh gốc ở đâu, ví dụ ImageView myIV:

Nguyên:

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

New (bên trong onBitmapLoaded()của new Target()):

public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    myIV.setImageBitmap(bitmap);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.