最近,优酷的创始人兼CEO古永锵,宣布不再担任优酷土豆的董事长兼CEO身份,视频行业的最后一位创业老兵也正式退出了这个行业的舞台。古永锵曾经是搜狐的首席运营官,2005年从搜狐辞职创办了优酷网,之后优酷发展迅速,成为了视频行业的老大。但视频行业的所有公司没有一家是盈利的,即时后来合并了土豆网之后,古永锵也没能扭转优酷亏损的局面。去年阿里巴巴收购优酷土豆,其实已经隐隐暗示了古永锵的出局,这个行业他已经拼不动了。
本篇是
milter
的第三篇投稿,给大家分析了DataBinding的核心原理。希望对大家有所帮助。另外作者博客里原理分析的文章很多,感兴趣的朋友可以看看。
milter
的博客地址:
http://www.jianshu.com/users/511ba5d71aef
关于
DataBinding
技术,网上教程可谓多矣,但大都没能摆脱简单拷贝、翻译修改官方文档的嫌疑,个别的翻译的还不准确,初学者很容易被误导。鉴于此,本文结合本人项目实践中的经验与思考,为广大Android 开发者提供一篇有观点、有思考的
DataBinding
讲解文章。
DataBinding
技术的出现,肯定是为了解决我们在开发中的一些痛点问题。所以,了解
DataBinding
要解决的问题,能够使我们更深刻地理解
DataBinding
技术的设计实现。
从开发角度看,简言之,
DataBinding
主要解决了两个问题:
应该说,针对上述问题,都有第三方解决方案。第一个问题可以使用
Jake Wharton
的
ButterKnife
;对于第二个问题,谷歌提供了
Loop-Handler
方案,你还可以使用
RxJava
,
EventBus
等方案,但它们只是解决了线程切换的问题,却没有解决将数据分解映射到各个view的问题,这正是
DataBinding
的魅力所在!
同时,
DataBinding
的线程切换也是透明的,这是指,当你的
Activity
需要展示新的数据时,你可以在后台线程中获取数据,然后直接交给
DataBinding
就可以了,完全不需要关心线程切换的问题。
总体思路
DataBinding
解决这些问题的思路非常简单。就是针对
每个Activity
的布局,在编译阶段,生成一个
ViewDataBinding
类的对象,该对象持有
Activity
要展示的数据和布局中的各个view的引用(
这里已经解决了令人厌烦的findViewById问题
)。同时该对象还有如下可喜的功能:
-
将数据分解到各个view
-
在UI线程上更新数据
-
监控数据的变化,实时更新
有了这些功能,你会感觉到,你要展示的数据已经和展示它的布局紧紧绑定在了一起,这就是该技术叫做
DataBinding
的原因。
实现细节
下面,我们深入
DataBinding
的内部,看看它是如何实现以上所说的功能的。如何设置使用
DataBinding
在此就不赘述了,网上大把大把的资料。示范项目基本情况:
avatar_pure.jpg
avatar_sexy.jpg
有了以上的准备工作,我们可以开始了。首先创建如下一个布局:
我们看到,使用
DataBinding
需要遵照一定的模板去写布局文件,这个模板如下:
我们的 Activity
onCreate()
方法是这样的:
然后运行我们的程序,结果如下:
那么问题来了,
DataBinding究竟在背后做了什么?
下面,我们就分步骤进行讲解。
对布局文件进行预处理
首先,
DataBinding
会对根元素为
的布局文件进行预处理(本例中即activity_main.xml),处理后,原布局文件会变成这个样子:
我们看到,根元素
LinearLayout
和那些在属性中使用了
binding表达式
的view都被设置了
Tag
,而原有的
标签
、
data标签
以及里面的
variable标签
,还有各个view中的
binding表达式
都不见了!!