2016-03-05 22 views
5

Một trong những tính năng thú vị nhất của hỗ trợ ràng buộc dữ liệu Android là nó cũng tạo ra các trường cho chế độ xem có ID được đặt. Việc này sẽ dọn dẹp mã lệnh không có trường hoặc cần gọi findViewById().Android có thể bị ràng buộc dữ liệu lười biếng?

Nhưng vấn đề là trường hợp ràng buộc chỉ có thể được truy xuất thông qua cuộc gọi bind() có xu hướng lên lịch ràng buộc. Điều này là xấu khi dữ liệu đang được nhận một cách không đồng bộ và thông thường là NullPointerException bị ném.

Trường hợp ràng buộc với trường Chế độ xem có được truy xuất trừ đi quá trình ràng buộc dữ liệu thực tế không?

stack-trace:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference 
     at com.app.android.databinding.ActivityRestaurantDetailsBinding.executeBindings(ActivityRestaurantDetailsBinding.java:381) 
     at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:350) 
     at android.databinding.ViewDataBinding$6.run(ViewDataBinding.java:167) 
     at android.databinding.ViewDataBinding$5.onViewAttachedToWindow(ViewDataBinding.java:137) 
     at android.view.View.dispatchAttachedToWindow(View.java:14525) 

Trả lời

3

này dường như không có ý nghĩa, dữ liệu ràng buộc sẽ bỏ qua các biến rỗng do đó không có con trỏ null nên được ném ra, có nghĩa là, tôi tin rằng, một trong những tính năng thúc đẩy nhất . Nếu bạn cần phải sửa đổi các biến sau khi các cuộc gọi async vv bạn chỉ có thể sử dụng dataBinding.executePendingBindings()

Từ the docs

Lớp ràng buộc được tạo ra sẽ có một setter và getter cho mỗi người trong số các biến được mô tả. Các biến sẽ lấy mặc định giá trị Java cho đến khi setter được gọi là - null cho các loại tài liệu tham khảo, 0 cho int, false cho boolean vv

dữ liệu được tạo ra mã ràng buộc tự động kiểm tra null và tránh ngoại lệ con trỏ null. Ví dụ, trong biểu thức @ {user.name}, nếu người dùng là null, user.name sẽ được gán giá trị mặc định của nó (null). Nếu bạn đang tham chiếu user.age, trong đó độ tuổi là int, thì nó sẽ mặc định là 0.

+0

Tôi cũng mong đợi như vậy. Khi kiểm tra mã được tạo ra, đã có nhiều kiểm tra null tại chỗ, nhưng nó không đúng với kiểu boolean này. Điều này có vẻ giống như một con bọ không? – razzledazzle

+0

Tương tự với 'android: text =" @ {DateFormatter.format (item.orderDate)} "'. Điều này dẫn đến một nguyên nhân NPE gọi 'DateFormatter.format (null)'. – drindt

+1

Sau khi đã sử dụng databinding trong vài tháng qua có vẻ vẫn còn rất nhiều vấn đề với kiểm tra null đó là rất đáng thất vọng. Nguyên nhân nổi bật nhất trong số đó là các kiểu boolean như @razzledazzle đã nói –

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