专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
开发者全社区  ·  37岁被腾讯裁员,找了两个月只有两 ... ·  14 小时前  
开发者全社区  ·  看了《西游记》18位女神今昔对比照,才懂“不 ... ·  19 小时前  
开发者全社区  ·  字节员工工资都这么高吗?:32岁,目前已经实 ... ·  19 小时前  
开发者全社区  ·  清华张xx偷入华电女厕所被处理 ·  昨天  
开发者全社区  ·  公募频出大瓜!两大佬都失联了 ·  2 天前  
51好读  ›  专栏  ›  郭霖

DataBinding实现原理探析

郭霖  · 公众号  · android  · 2016-11-02 08:00

正文

今日科技快讯

最近,优酷的创始人兼CEO古永锵,宣布不再担任优酷土豆的董事长兼CEO身份,视频行业的最后一位创业老兵也正式退出了这个行业的舞台。古永锵曾经是搜狐的首席运营官,2005年从搜狐辞职创办了优酷网,之后优酷发展迅速,成为了视频行业的老大。但视频行业的所有公司没有一家是盈利的,即时后来合并了土豆网之后,古永锵也没能扭转优酷亏损的局面。去年阿里巴巴收购优酷土豆,其实已经隐隐暗示了古永锵的出局,这个行业他已经拼不动了。

作者简介

本篇是 milter 的第三篇投稿,给大家分析了DataBinding的核心原理。希望对大家有所帮助。另外作者博客里原理分析的文章很多,感兴趣的朋友可以看看。

milter 的博客地址:

http://www.jianshu.com/users/511ba5d71aef

引言

关于 DataBinding 技术,网上教程可谓多矣,但大都没能摆脱简单拷贝、翻译修改官方文档的嫌疑,个别的翻译的还不准确,初学者很容易被误导。鉴于此,本文结合本人项目实践中的经验与思考,为广大Android 开发者提供一篇有观点、有思考的 DataBinding 讲解文章。

DataBinding解决什么问题

DataBinding 技术的出现,肯定是为了解决我们在开发中的一些痛点问题。所以,了解 DataBinding 要解决的问题,能够使我们更深刻地理解 DataBinding 技术的设计实现。

从开发角度看,简言之, DataBinding 主要解决了两个问题:

  • 需要多次使用 findViewById ,损害了应用性能且令人厌烦

  • 更新UI数据需切换至UI线程,将数据分解映射到各个view比较麻烦

应该说,针对上述问题,都有第三方解决方案。第一个问题可以使用 Jake Wharton ButterKnife ;对于第二个问题,谷歌提供了 Loop-Handler 方案,你还可以使用 RxJava EventBus 等方案,但它们只是解决了线程切换的问题,却没有解决将数据分解映射到各个view的问题,这正是 DataBinding 的魅力所在!

同时, DataBinding 的线程切换也是透明的,这是指,当你的 Activity 需要展示新的数据时,你可以在后台线程中获取数据,然后直接交给 DataBinding 就可以了,完全不需要关心线程切换的问题。

如何解决这些问题

总体思路

DataBinding 解决这些问题的思路非常简单。就是针对 每个Activity 的布局,在编译阶段,生成一个 ViewDataBinding 类的对象,该对象持有 Activity 要展示的数据和布局中的各个view的引用( 这里已经解决了令人厌烦的findViewById问题 )。同时该对象还有如下可喜的功能:

  • 将数据分解到各个view

  • 在UI线程上更新数据

  • 监控数据的变化,实时更新

有了这些功能,你会感觉到,你要展示的数据已经和展示它的布局紧紧绑定在了一起,这就是该技术叫做 DataBinding 的原因。

实现细节

下面,我们深入 DataBinding 的内部,看看它是如何实现以上所说的功能的。如何设置使用 DataBinding 在此就不赘述了,网上大把大把的资料。示范项目基本情况:

  • 项目名称为 DataBindingTest

  • 项目包名 com.like4hub.www.databindingtest

  • 项目只有一个主Activity,名称为MainActivity,其布局文件为activity_main.xml

  • 项目用到的图片资源有两个,如下:

avatar_pure.jpg

avatar_sexy.jpg

  • 项目中要展示的数据是User, 其代码如下:


有了以上的准备工作,我们可以开始了。首先创建如下一个布局:


我们看到,使用 DataBinding 需要遵照一定的模板去写布局文件,这个模板如下:


我们的 Activity onCreate() 方法是这样的:


然后运行我们的程序,结果如下:

那么问题来了, DataBinding究竟在背后做了什么? 下面,我们就分步骤进行讲解。

DataBinding在背后做什么

对布局文件进行预处理

首先, DataBinding 会对根元素为 的布局文件进行预处理(本例中即activity_main.xml),处理后,原布局文件会变成这个样子:


我们看到,根元素 LinearLayout 和那些在属性中使用了 binding表达式 的view都被设置了 Tag ,而原有的 标签 data标签 以及里面的 variable标签 ,还有各个view中的 binding表达式 都不见了!!







请到「今天看啥」查看全文