其他资料
https://realm.io/cn/news/data-binding-android-boyar-mount/
http://gold.xitu.io/post/578b944a128fe10063ad6c05
优点
1. xml中的表达式会自动判空,也就是表达式本身不会抛null point异常;
2. 自动找公开成员变量或者get方法。
- xml中的表达式 contact.address 首先会尝试直接获取获取,即contact.address。如果成员变量address被申明为private的,就会尝试调用contact.getAddress()方法。
-
<android.support.v4.widget.DrawerLayout android:layout_width="wrap_content" android:layout_height="wrap_content" app:scrimColor="@{@color/scrimColor}"/>
如上,DrawerLayout元素没有android:scrimColor 这样的写法,但通过app命名空间,数据绑定就会去找DrawerLayout.setScrimColor()方法,非常方便
3. 支持list map
4. 性能好,无反射。
传统的findview方法耗时,并且每次findView都需要遍历view hierarchy。但DataBinding会先遍历一次,把各个view存储下来,查找view的时候直接取就行了,不需要遍历。
5. 解耦
通过
@BindingAdapter({"bind:imageUrl", "bind:error"})
public static void loadImage(ImageView view, String url, Drawable error) {
Picasso.with(view.getContext()).load(url).error(error).into(view);
}
按照定义好的图片加载方法,在xml中直接使用
app:error="@{@drawable/error}"
app:imageUrl="@{imageUrl}"
这样通过定义图片加载接口loadImage实现了解耦,如果要改图片加载方案,只需要改此接口。
缺点
- 无法调试数据绑定框架本身。如果有问题,只能检查自己的写法,或者就归于框架bug,无法debug确定
- 是比较新的框架,后期API改动可能性大,并且框架本身仍在完善中,比如会有bug,对一些复杂情况(RecyvleView的不常用回调,自定义View等)可能没有很成熟的支持,也不支持AdapterView对DataSource的动态绑定。针对这些复杂情况,可以在xml中给view定义id,这样就能通过binding对象获取view, 就可以按照传统的方式处理了。
而AdapterView的DataSource动态绑定问题,可以使用开源框架解决,或者使用BindingAdapter注解,相信后续框架会更方便的支持。