2015-10-27 17 views
17

Tôi vừa mới bắt đầu chuyển từ Trình tải ảnh toàn cục sang Glide. Tuy nhiên, khi di chuyển xuống và lên một lần nữa trong recyclerview tôi nhận được tấn tin nhắn cảnh báo.Cảnh báo bằng cách sử dụng Glide trong Recyclerview

W/Bitmap: Called reconfigure on a bitmap that is in use! This may cause graphical corruption! 

Nếu tôi hoán đổi Glide cho thư viện tải hình ảnh khác, cảnh báo biến mất. Mã trong bindViewHolder liên quan đến hình ảnh:

Glide.with(viewHolder.imageView.getContext()) 
      .load(DisplayImageUtil.getImageUrl(item.getImageUrl(), 600)) 
      .diskCacheStrategy(DiskCacheStrategy.ALL) 
      .into(viewHolder.imageView); 

Thử nghiệm trên Nexus 5.

+0

Điều này có xảy ra trên Android M không? https://github.com/bumptech/glide/issues/743 – TWiStErRob

Trả lời

0

này được thảo luận here,

Thông thường đây là kết quả của việc lạm dụng Bitmaps, hoặc bằng cách quay một Bitmap vào hồ bơi nhiều lần mà không có một trung gian có được, hoặc bằng cách tham chiếu các bitmap sau khi gọi rõ ràng() trên tương ứng mục tiêu. Nếu bạn có các biến đổi tùy chỉnh, đó là một nơi tốt để xem xét chặt chẽ để đảm bảo rằng bạn không trả về một bitmap cho hồ bơi hai lần. Bạn có thể xem thêm về vấn đề này trên wiki: https://github.com/bumptech/glide/wiki/Resource-re-use-in-Glide.

Nhật ký bạn thấy là từ khối catch (ngoại lệ bắt được). Hãy chắc chắn rằng bạn là:

  • Không cố gắng để tải 2 bitmap trong một quan điểm mục tiêu
  • Không thanh toán bù trừ các tài nguyên để tái sử dụng các quan điểm mục tiêu nhưng giữ vào tài nguyên của tham khảo

kể từ khi bạn đang sử dụng recyclerView , có thể điểm thứ hai là đúng nghĩa là tái chế chế độ xem trong khi giữ nguyên tất cả các tham chiếu bitmap

+0

Tôi không chắc mình hoàn toàn hiểu được vấn đề.Tôi không làm bất kỳ tái chế tùy chỉnh, tôi chỉ tải hình ảnh trong bindViewHolder từ RecyclerView. Sự cố xảy ra khi tôi cuộn lên và hình ảnh được tải lại. Đây có phải là thứ tôi phải xử lý bằng tay với Glide không? Chỉ sử dụng UIL trước đây và không gặp phải bất kỳ vấn đề nào như thế này. – Bendik

+0

@Kay, bạn đang đề cập đến "khối catch" nào? Tôi thấy đó là một cảnh báo từ nguồn gốc [Bitmap.cpp] (https://github.com/android/platform_frameworks_base/blob/marshmallow-release/core/jni/android/graphics/Bitmap.cpp#L256). – TWiStErRob

+3

Câu trả lời này không chính xác, báo giá tham chiếu đến IllegalArgumentException, không phải cảnh báo ở đây. Cảnh báo trong câu hỏi ban đầu sẽ xảy ra trong quá trình sử dụng Glide bình thường và không phải là kết quả của việc sử dụng sai Bitmap. –

1

Tôi chạy đến cùng một vấn đề sau lần chạy ứng dụng đầu tiên của tôi trên Android M (Nexus 5x).

EDIT: sau khi mở sự cố trên Glide Github - https://github.com/bumptech/glide/issues/743, tôi thấy rằng "giải pháp" gốc của tôi không giải quyết được sự cố, chỉ ẩn thư. Cảnh báo đến từ Bitmap của Android và đó là vì Glide sử dụng lại Bitmap để có hiệu suất tốt hơn.

+0

Hãy cẩn thận, tăng số lần xem mục trong RecyclerView có thể dẫn đến việc sử dụng nhiều bộ nhớ hơn mức cần thiết. – TWiStErRob

+0

@TWiStErRob - bạn nói đúng. Tôi thay vì chỉnh sửa câu trả lời để ngăn chặn người khác lừa dối đường dẫn sai. – JirkaV

0

Hãy thử gọi Glide.clear() trước khi tải hình ảnh.

Glide.clear(viewHolder.imageView); 
Glide.with(viewHolder.imageView.getContext()) 
     .load(DisplayImageUtil.getImageUrl(item.getImageUrl(), 600)) 
     .diskCacheStrategy(DiskCacheStrategy.ALL) 
     .into(viewHolder.imageView); 

Hy vọng trợ giúp này.

+3

thêm Glide.clear() không loại trừ được vấn đề đối với tôi: ( – tieorange

0

Tôi đã nhận được cảnh báo và tham nhũng đồ họa. Đây là dạng bitmap bị cắt bớt xuất hiện ở trên cùng và dưới cùng của chế độ xem của người tái chế và ở đó nếu di chuyển quá nhanh.

Đặt chế độ xem hình ảnh bên trong bố cục khung hình đã loại bỏ tham nhũng đồ họa.

+0

không hoạt động đối với tôi: / –

0

Bạn có thể xóa nhật ký bằng Bộ lọc Logcat trên Android Studio.

Thêm ^(?!AbsListView|IInputConnectionWrapper|ApplicationPackageManager|Bitmap|ViewRootImpl) vào bộ lọc Logcat của Android.

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