2013-06-11 47 views
17

Tôi đang phát xung quanh với thư viện Picasso để tải hình ảnh, nhưng tôi đang gặp sự cố. Khi một hình ảnh không tải được, tôi muốn ẩn chế độ xem thay vì tải trong hình ảnh mặc định. Tôi nhận thấy từ nguồn rằng có vẻ như cách duy nhất để thêm một người nghe là từ người xây dựng, nhưng phương pháp lỗi không bao giờ được gọi khi một hình ảnh không tải được. Ai có kinh nghiệm với cái này rồi nào?Thư viện Picasso, Android: Sử dụng Trình nghe Lỗi

iv = (ImageView) findViewById(R.id.imageView); 

    Picasso.Builder builder = new Picasso.Builder(getApplicationContext()); 
    builder.listener(new Picasso.Listener() { 

     @Override 
     public void onImageLoadFailed(Picasso arg0, String arg1) { 
      Log.e("Picasso Error", "Errored out, hiding view"); 
      iv.setVisibility(View.GONE); 
     } 
    }); 
    Picasso pic = builder.build(); 
    pic.load("thisshouldbreak.jpg").into(iv); 

Trả lời

43

Picasso 2.0 cho phép bạn đính kèm gọi lại vào yêu cầu.

https://github.com/square/picasso

Việc gọi lại bạn đang sử dụng là cho người nghe "toàn cầu" và nó sẽ giúp bạn gỡ rối các lỗi có khả năng xảy ra do một tải mạng.

Sử dụng load(url).into(view, new Callback() {...}); trong Picasso 2.0.

Nhớ gọi cancelRequest(target) nếu bạn đang sử dụng Callback.

+0

Làm cách nào để tải Picasso 2.0? Tôi chỉ thấy 1.1.1. – howettl

+0

Lấy nguồn và xây dựng bình thủ công. Phát hành chính thức sắp ra mắt. – dnkoutso

+1

@howettl nhận được [Picasso2] (https://twitter.com/dnkoutso/status/369987447834173440) tại đây – Asthme

1

Chỉ là một gợi ý, nhưng bạn có thể tránh các vấn đề trong lập trình nếu bạn tạo tệp png "trống" và đặt làm tệp hình ảnh mặc định trong thư mục res của bạn ... kinda ngớ ngẩn tôi biết ... nhưng có khả năng hoạt động mà không cần chiến đấu ...

+0

không phải là cách thực tế. tất nhiên trong một số trường hợp nếu url hình ảnh không phải là một định dạng hợp lệ thì đó là một gợi ý tốt. nhưng điều gì xảy ra nếu một số url là 1. //cdn.bla2.com/sample.png 2. http://cdn.bla2.com/sample.png trong trường hợp này, lỗi của nó chỉ vì tiền tố nên tốt để kiểm tra lỗi này cũng như –

+0

nó hoạt động, nhưng cảm ơn bạn đã dành thời gian bỏ phiếu cho nó ... điểm cung cấp giải pháp là giải pháp làm việc –

+1

bằng cách emil ... bạn có thể muốn kiểm tra những ngày ... tôi giải quyết vấn đề của mình trước khi picasso 2 ra ... tất nhiên câu trả lời trẻ phụ thuộc vào nó ... –

13

My dụ:

Picasso picasso = new Picasso.Builder(parent.getContext()) 
      .listener(new Picasso.Listener() { 
       @Override 
       public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) { 
       //Here your log 
       } 
      }) 
      .build(); 
    picasso.load(shopModel.getShopImg()) 
      .fit() 
      .into(viewHolder.shopImg); 
3

câu trả lời của tôi:

File file = new File(filePath); 
     Picasso.with(context).load(file).placeholder(R.drawable.draw_detailed_view_display).error(R.drawable.draw_detailed_view_display) 
     .resize(400, 400).into(mImageView, new Callback() { 

      @Override 
      public void onSuccess() { 

      } 

      @Override 
      public void onError() { 
       mImageView.setVisibility(View.GONE); 
      } 
     }); 
+0

Xin cảm ơn bạn đã hỗ trợ , Có vẻ như một lời giải thích dễ hiểu hơn đối với mã sẽ hữu ích hơn –

4

Bạn có thể cố gắng thêm một người biết lắng nghe 'toàn cầu'.

// create Picasso.Builder object 
    Picasso.Builder picassoBuilder = new Picasso.Builder(this); 

    picassoBuilder.listener(new Picasso.Listener() { 
     @Override 
     public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) { 
      Log.e("PICASSO", uri.toString(), exception); 
     } 
    }); 

    // Picasso.Builder creates the Picasso object to do the actual requests 
    Picasso picasso = picassoBuilder.build(); 

    try { 
     Picasso.setSingletonInstance(picasso); 
    } catch (IllegalStateException ignored) { 
     // Picasso instance was already set 
     // cannot set it after Picasso.with(Context) was already in use 
    } 

Bất kỳ cuộc gọi tiếp theo để Picasso.with(Context context) sẽ trở lại với ví dụ mà kết nối với người nghe, vì vậy tất cả thất bại sẽ được đăng nhập.

Xin lưu ý rằng bạn cần gọi số setSingletonInstance càng sớm càng tốt, ví dụ: trong Đơn đăng ký onCreate.

P.S. Mã được chấp nhận từ đây - Customizing Picasso with Picasso.Builder

+1

Cảm ơn! Điều này cũng cho phép tôi sử dụng okhttpclient tùy chỉnh bằng cách sử dụng các chứng chỉ tự ký. – Cognoscis

0

Khi chúng tôi gặp lỗi, lỗi sẽ chuyển sang phương thức onError sau đó chúng tôi xử lý!

private void getAvatar(){ 
    try { 
     Picasso.with(mContext) 
       .load(G.GET_AVATAR + '/' + G.SPUser.getString(G.PHONE_NUMBER_KEY, null) + ".jpg") 
       .into(imgUserAvatar, new Callback() { 
        @Override 
        public void onSuccess() { 

        } 

        @Override 
        public void onError() { 
         imgUserAvatar.setImageResource(R.drawable.icon_profile_default); 
        } 
       }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

Bạn có một chút muộn cho bữa tiệc: P Đây là từ 4 năm trước trước khi onError tồn tại. –

Các vấn đề liên quan