Android DataBinding(数据绑定)详解(二)

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/JavaAndroid730/article/details/71601294

前言

上一节,我们对DataBinding进行了简单的了解和使用,相信你已经有了基本的认识。这一节,我们将对DataBinding的初始化原理进行学习,当然我们不做深度的解析,毕竟,大多数的朋友们更关注的是如何将它运用到项目中。

高能君:前方高能,内容可能枯燥无味,感兴趣的朋友可以了解一下,不感兴趣的朋友赶紧跳过进入下一节吧。

基本原理

  • android.binding
  • BR
  • Binding类

当我们进行了环境搭建后,我们便可以在Project Libraries中找到一个名为library-x.x.x的jar包,可以在里面看到DataBinding给我们准备好的工具类。

这里写图片描述

还记得我们基础使用时,使用了DataBindingUtil来替换原来的setContentView吗?在这里我们就来探究一下,这个DataBindingUtil到底为我们做了什么,双击打开这个类。卧槽?相信只要是看源码的朋友都会这么说,一大堆英文看着头晕啊,但我们不要惊慌,我们是带着目的来的,我们往下翻,很快就可以找到下面的setContentView方法。

这里写图片描述

我们可以看到方法中第一句话就是原来的setContentView,接着拿到当前活动的DecorView,然后通过DecorView拿到ViewGroup,最后调用binToAddedViews方法来完成执行。那么binToAddedViews方法又是干嘛的呢?让我们鼠标滚动起来,滑到该类的最后,就会发现这个方法了。

这里写图片描述

在这里,就是将试图中所有子view进行了一个bind操作,就像上节我们一开始替换findViewById(),当我们给控件设置了id,那么bind就进行了绑定。还记得我们在xml第一步要做什么吗?就是嵌套一层layout,那时候系统就为我们生成了对应的Binding类,bind操作就将获取到的值,传入生成好的Binding类,生成好的Binding类就会在内部帮助我们进行一些初始化(例如findViewById)的操作啦。这里只做浅析,就不依次打开对应的源码了,毕竟一直看源码,心里很方啊!

简单的了解了初始化的原理后,大家可能也有点半懵半懂,那这里用广义的话再来说说,顺便放张图压压惊。
这里写图片描述

首先,gradle进行编译,因为我们使用了databinding,那么就会开始处理layout文件,接下来会开始处理@{}的操作,然后回到java类中编译,最后通过Binding对象来set操作,讲数据源绑定到xml中。

放了张图后,是不是已经开始有点略懂略懂了呢?当然对于DataBinding来说,我们只要稍微理解一点原理就行,不要本末倒置,把它运用到我们的项目中,才是第一要务!(哈哈哈,其实是偷懒了,在初稿的时候写了很多,但最后发现太枯燥无味,而且作用不大,所以就索性简单讲讲,感兴趣的朋友可以自己打开源码看看哟~~)

那么简单说了这些原理后,有什么实际作用呢,不可能光瞎扯吧?(:зゝ∠) 哼,当然还是有作用的!!!那就是群众们都说的DataBinding性能的优势,就体现在源码中了。

  • 通过源码可以看到,几乎全都是静态调用执行,这就做到了0反射的效果
  • 众所周知,findViewById需要遍历整个viewGroup,而这里只需要做一次
  • 使用位标记来检查更新(通过mDirtyFlags更新)
  • 数据改变在下一次批量更新才会触发
  • 缓存表达式(在xml中对三元运算符的灵活运用)

以下内容被砍,作者内心已身受重伤。

来来回回修改了好几遍,拿给朋友也看了看,他们也觉得实用性不强,篇幅长了看不进去,篇幅短了又根本讲不清楚,再者一提到原理啊,源码啊,很多朋友都心里有道坎/(ㄒoㄒ)/~~所以内容一砍再砍,MD都快削没了!我的心拔凉拔凉的~那也不能不写对吧,毕竟第一节中挖了九大坑,必须填完啊,于是就有了这节内容,希望大家理解。我知道你们会原谅我的,么么哒。

从下一节开始,我们将正式开始把DataBinding运用到项目里,大家准备好刷卡上车吧!

猜你喜欢

转载自blog.csdn.net/JavaAndroid730/article/details/71601294