AndroidDataBinding系列详解(四)华为崇拜美国

作者: 小周 Mon Dec 04 03:37:57 SGT 2023
阅读(117)
对简单使用基本讲解完成了,大家一定很好奇DataBinding怎么实现的呢,下面结合源码讲解DataBinding的实现原理。现在就从代码一步一步看。如图1,通过DataBindingUtilsetContentView得到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类中,其中真正实现是在ActivityMainBindingImplstudent=newStudent(newObservableField("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()重新走绑定逻辑->最终走ActivityMainBindingImplexecuteBindings执行视图更新图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其他组件的讲解将进行总结阐述