本文参照[Data Binding Library - Android Developers 谷歌官方][Data Binding Library - Android Developers] 从今天开始将为大家由浅入深(PS:希望不是从入门到放弃)的讲一下谷歌在安卓平台上的数据绑定框架:Databinding。 前言: ..

Android mvvm 框架 databinding

本文参照[Data Binding Library - Android Developers 谷歌官方][Data Binding Library - Android Developers]

从今天开始将为大家由浅入深(PS:希望不是从入门到放弃)的讲一下谷歌在安卓平台上的数据绑定框架:Databinding

前言:

2015 年谷歌 I/O 大会上就介绍了一个框架 DataBinding,堪称解决界面逻辑的黑科技,但是使用率非常少,研究的人更少,那这是不是一个优秀的框架呢,是不是对项目有用呢,接下来的几天我将带大家深入研究一下。

这篇文章不说技术,只了解一下 DataBinding。

一、数据绑定是什么?

几年前,数据绑定便已在前端世界中风生水起,Angular.js、React.js、vue.js 等热门前端框架都具备这种能力。

数据绑定简单来说,就是通过某种机制,把代码中的数据和 xml(UI)绑定起来,双方都能对数据进行操作,并且在数据发生变化的时候,自动刷新数据。

二、数据绑定怎么用?

数据绑定分为单向绑定双向绑定两种方式。

单向绑定就是说数据的流向是单方面的,只能从代码流向 UI;

双向绑定的数据流向是双向的,当业务代码中的数据改变时,UI 上的数据能够得到刷新;当用户通过 UI 交互编辑了数据时,数据的变化也能自动的更新到业务代码中的数据上。

![Image 1][]

单向数据绑定和双向数据绑定示例

三、DataBinding 这门技术有什么优点呢?

1.性能很好,因为它 0 反射,而且性能比直接 findViewById 要高。后面的文章将会从源码角度介绍。

2.谷歌原生支持(相比与其他第三方的数据绑定框架比如[Android][]-databinding 和 RoboBinding),可以说是亲儿子,有自家 IDE 支持。

3.将 MVP 框架变成MVVM 框架,代码更简洁,逻辑更清晰。

4.减少代码线程切换更新 UI(列表除外),除了要在列表中考虑线程问题。

5.自动检查空指针,也不用担心空指针。

四、DataBinding 这门技术一直不温不火,为什么呢?

根据我的使用感受是这么几条:

1.不太成熟,当然并不是说技术不成熟,只是 Android Studio 的 IDE 对 XML 编写时还是不太友好;代码自动补全功能做得还是有点差;另外如果 XML 中有编辑错误,在 Build 的时的提示会很莫名其妙,很难排查到问题。这几个小问题有待 Google 日后的改善。

2.使用局限,在使用过程中发现它与某些技术冲突,比如插件化技术、热修复技术,如果想用 Databinding 还需要另外增加开发成本来配合它。

3.学习成本,其实我认为这个并不算一条,因为做我们这行学什么没有成本呢,是吧。

回答完上面几个问题,那我们看 DataBinding 解决了哪几个痛点会被称为解决界面逻辑的黑科技的呢?(咳咳,划重点了)

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

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

-自动检查空指针,例如 android:text="@{user.lastName}" ,如果 user 为空,程序不会崩溃,只是显示空值。

Data Binding 解决了 Android UI 编程中的这几个痛点,官方原生支持 MVVM 模型可以让我们在不改变既有代码框架的前提下,非常容易地使用这些新特性。其实在此之前,已经有些第三方的框架([RoboAndroid][]) 可以支持 MVVM 模型,无耐由于框架的侵入性太强,导致一直没有流行起来。

说了这么多,有没有跃跃欲试呢?

现在 Android Studio 2.0 已经发布了,对 data binding 的支持又更进了一步!

  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    285 引用 • 300 回帖 • 544 关注
  • MVVM
    2 引用
  • 框架
    34 引用 • 280 回帖
  • DataBinding
    2 引用
回帖
请输入回帖内容...