美文网首页
Android DataBinding系列详解(四)

Android DataBinding系列详解(四)

作者: cqj | 来源:发表于2022-07-24 15:00 被阅读0次

    对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其他组件的讲解将进行总结阐述

    相关文章

      网友评论

          本文标题:Android DataBinding系列详解(四)

          本文链接:https://www.haomeiwen.com/subject/fmjmirtx.html