对DataBinding简单使用基本讲解完成了,大家一定很好奇DataBinding怎么实现的呢,下面结合源码讲解DataBinding的实现原理。
现在就从代码一步一步看。如图1,通过DataBindingUtil setContentView得到ActivityMainBinding对象
图1省略中间步骤,最终是调用sMapper.getDataBinder,sMapper是DataBinderMapperImpl实现类
图2DataBinderMapperImpl是由编译器动态生成的,如图3,其实很简单,就是加入了一个本地生成的DataBinderMapperImpl
图3如图4,看下DataBinderMapperImpl的源码,其实就是获取到了ActivityMainBindingImpl的实现类,
图4如图5,ActivityMainBindingImpl 完成构造函数后调用invalidateAll()
图5如图6,调用requestRebind(),继续进去看
图6省略细节,代码走到mChoreographer.postFrameCallback(mFrameCallback)->mRebindRunnable.run()->executePendingBindings()->executeBindingsInternal()->executeBindings()。
图7executeBindings真正实现是在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其他组件的讲解将进行总结阐述
网友评论