核心
核心在于自动生成的代码里面,位置在app/build/generated/data_binding…/…;一直到自动生成的代码里面
-
UI调用DataBindingUtil.setContentView
... lateinit var binding: ActivityMainBinding ... binding = DataBindingUtil.setContentView(this, R.layout.activity_main) ...
-
DataBindingUtil内部操作
/** * 返回一个ViewDataBinding的子类,明显就是自动生成的那个xxxxBinding */ public static <T extends ViewDataBinding> T setContentView(@NonNull Activity activity,int layoutId, @Nullable DataBindingComponent bindingComponent) { .... .... // 调用了自己的bindToAddedViews方法 return bindToAddedViews(bindingComponent, contentView, 0, layoutId); }
bindToAddedViews方法又调用了自己的bind方法,而bind方法返回的是一个ViewDataBinding对象实例。
此时,自动生成的xxxBinding类是ViewDataBinding的子类,最终还是调用了xxxBinding的bind方法,返回的也是自己的对象实例 -
xxxBinding自动生成类的操作
这个自动生成类的构造方法中,就指定了控件对象,还提供了绑定数据的set/get方法... protected ActivityMainBinding(Object _bindingComponent, View _root, int _localFieldCount, LinearLayout llFm1, TextView tvIn, TextView tvOut) { super(_bindingComponent, _root, _localFieldCount); this.llFm1 = llFm1; this.tvIn = tvIn; this.tvOut = tvOut; } public abstract void setUser(@Nullable User user); @Nullable public User getUser() { return mUser; } ...
在我们调用了setXXX的方式来设置绑定数据的时候,会对页面进行刷新,找到绑定的数据的值对控件进行填充
整个流程的参与者:使用Binding的UI,DataBindUtil,自动生成的Binding类,以及要绑定的数据Model类
流程原理
性能
总结,性能和稳定性都很好