Android DataBinding系列详解(四)
2024-04-10 05:10:19  阅读数 1915

对DataBinding简单使用基本讲解完成了,大家一定很好奇DataBinding怎么实现的呢,下面结合源码讲解DataBinding的实现原理。

现在就从代码一步一步看。如图1,通过DataBindingUtil setContentView得到ActivityMainBinding对象

图1

省略中间步骤,最终是调用sMapper.getDataBinder,sMapper是DataBinderMapperImpl实现类

图2

DataBinderMapperImpl是由编译器动态生成的,如图3,其实很简单,就是加入了一个本地生成的DataBinderMapperImpl

图3

如图4,看下DataBinderMapperImpl的源码,其实就是获取到了ActivityMainBindingImpl的实现类,

图4

如图5,ActivityMainBindingImpl 完成构造函数后调用invalidateAll()

图5

如图6,调用requestRebind(),继续进去看

图6

省略细节,代码走到mChoreographer.postFrameCallback(mFrameCallback)->mRebindRunnable.run()->executePendingBindings()->executeBindingsInternal()->executeBindings()。

图7

executeBindings真正实现是在ActivityMainBindingImpl里面,具体逻辑如图8,通过Android自带的TextViewBindingAdapter.setText更新TextView的文本消息

图8

整个初始化流程已经走完了,大家可能对具体的动态双向绑定还不是很了解,下面就对这些进行详解

将数据动态更新到视图

将新建的Bean类塞到ActivityMainBinding类中,其中真正实现是在ActivityMainBindingImpl

student =new Student(new ObservableField("Jack"));

activityMainBinding.setStudent(student);

如图9,更新视图更新标志位mDirtyFlags,调用notifyPropertyChanged(BR.student)->CallbackRegistry.notifyCallbacks()->CallbackRegistry.notifyRecurse()->CallbackRegistry.notifyCallbacks()->PropertyChangeRegistry.onNotifyCallback()->WeakPropertyListener.onPropertyChanged()->ViewDataBinding.handleFieldChange()->ActivityMainBindingImpl.onFieldChange()->返回false->super.requestRebind()重新走绑定逻辑->最终走ActivityMainBindingImpl executeBindings执行视图更新

图9

以上看到是整个变量的更新,如果是属性更新,如何动态改变视图呢,下面我们再看一看,整个的调用链是ObservableField.set()->BaseObservable.notifyChange()->PropertyChangeRegistry.notifyCallbacks()

图10

如图11所示,此时fileldId为0,对应的为BR._all,后面流程与上面一样

图11

但当调用ActivityMainBindingImpl .onFieldChange时,如图12,此处返回值为true

图12

此时返回值为true的话,会重新执行绑定,这样数据动态更新后,视图会同步更新就讲完了

图13

视图更新后,数据同步更新

ActivityMainBindingImpl 里面有个tvNameandroidTextAttrChanged的listener,明显的是,代码将更新的视图数据后来set到了已有的bean中

图14

这个listener在哪设置的呢,其实就在executeBindings方法执行的时候,调用了TextViewBindingAdapter.setTextWatcher

图15

很简单,其实就是在原生的TextWatcher监听器下面实现了二次监听,这样数据同步更新机制就讲完了,是不是很简单,其实就是内部帮我们实现了双向观察者模式,是不是很简单,其实DataBinding还有其他别的好处,后面结合jetpack其他组件的讲解将进行总结阐述