Android - Databinding 和Viewbinding的差异

1,199 阅读2分钟

Databinding

Databinding 是一个实现数据和UI绑定的框架,支持双向绑定。有了 Data Binding,在Android中也可以很方便的实现MVVM开发模式。

通过 Data Binding , 我们可以通过声明式布局以精简的代码来绑定应用程序逻辑和布局,这样我们可以精简大量view相关操作的代码了,如 findViewById()setText()setVisibility()setEnabled()setOnClickListener() 等。

Databinding的入门与原理分析

可以自行百度或者查看这篇博文 juejin.cn/post/704007…

viewBinding

viewBinding 会为每个 XML 布局文件生成一个绑定类。绑定类的实例包含在相应布局xml文件中具有 ID 的所有视图的直接引用。通过xml绑定,可以更轻松地编写可与视图交互的代码,所以不用再写一大堆的findviewbyid和定义一大堆的view变量了。

优点:

  • Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。
  • 类型安全:每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。
  • 更快的编译速度:视图绑定不需要处理注释,因此编译时间更短。
  • 易于使用:视图绑定不需要特别标记的 XML 布局文件,因此在应用中采用速度更快。在模块中启用视图绑定后,它会自动应用于该模块的所有布局。

不足:

  • 视图绑定不支持布局变量或布局表达式,因此不能用于直接在 XML 布局文件中声明动态界面内容。
  • 视图绑定不支持双向数据绑定。

Viewbinding的原理

编译时通过gradle插件扫描布局文件生成相应的绑定类——class文件,绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用,在Activity中初始化该对象,对控件进行调用。

ViewBinding和DataBinding的关系

image.png

viewbinding 相当于Databinding 的一个子集,两者都能做binding UI layouts的操作,但是databinding还支持一些额外的功能 如双向绑定,xml中使用变量等。

有databinding为什么还要出现viewbinding?

Databinding的不足:

  1. 因为需要编译期间annotation处理,所以需要花费更长的编译时间。
  2. Databinding 会增大包的体积。一个简单的demo databinding比viewbinding大50kb左右
  3. Databinding支持数据双向绑定,但是用起来很容易陷入歧途,即在xml中加入过多的逻辑判断,这对代码维护是恐怖的,如果java和xml都写逻辑判断,后期维护起来是非常痛苦的