专栏名称: Android_开发者
目录
相关文章推荐
51好读  ›  专栏  ›  Android_开发者

[译] Data Binding 库使用的经验教训

Android_开发者  · 掘金  · android  · 2019-06-05 04:46

正文

阅读 291

[译] Data Binding 库使用的经验教训

由 [Unsplash](https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 平台的用户 [rawpixel](https://unsplash.com/photos/uQkwbaP0UrI?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 拍摄

Data Binding 库 (下文中以『DB 库』词语来指代)提供了一个灵活强大的方式来绑定数据到 UI 界面。但是要用一句陈词滥调:『能力越大,责任越大』,仅仅是使用数据绑定,并不意味着你可以避免成为一个优秀 UI 开发者。

过去的几年我一直在 Android 开发中使用 data binding 库,本文会写出我这一路上了解到的与它有关的一些内容细节。

尽可能使用 bindings

自定义 binding adapter 是一种给 View 控件轻松提供自定义功能的好方法。和许多开发者一样,我对 binding adapter 研究得稍微深入,最终总结出一套包含 15 种不同用途的适配器 的类集。

最糟糕的实践是这类适配器,它们生成格式化的字符串并设置到 TextViews 控件,这些适配器通常仅在同一个布局文件中使用:

虽然这可能看起来很聪明,但是有三大缺点:

  1. 优化它们的过程太痛苦 。除非你把代码组织得非常好,否则你可能会有一个包含所有适配器方法的大文件,这与代码内聚和解耦原则相违背。

  2. 你需要使用 instrumentation 工具来做测试 。根据定义,你的 binding adapter 不会有返回值,它们接收一个输入参数后设置 view 的属性。这就意味着你必须使用 instrumentation 来测试你的自定义逻辑,这样会使得测试变得既缓慢又难以维护。

  3. 自定义 binding adapter 代码(通常)不是最佳选项 。如果你查看内建文本绑定[ 参考这里 ],你将会看到已经做了许多检查来避免调用 TextView.setText() ,这样就节省了被浪费的布局检测。我觉得自己陷入了这样的思维困境:DB 库将会自动优化我的 view 更新。它确实可以做到,但 仅限于 你使用被谨慎优化的内建 binding adapter的情况。

相反的,把你的方法的逻辑抽象为内聚类(我称之为文本创建者类),然后将它们传递给 binding。这样你就可以调用你的文本创建者类并使用内建 view binding:

这样我们可以从内建的绑定操作过程中提高效率,并且我们可以非常轻松地对创建格式化字符串的代码进行单元测试。

让你的自定义 binding 适配器变得高效

如果你确实需要使用自定义适配器,因为你所需的功能不存在,请尽量使其变得高效。我的意思是使用所有标准的 Android UI 优化:尽可能避免触发测量/布局操作。

这可以像检查当前使用的视图以及你设置的内容一样简单。这里有一个我们为 android:drawable 重新实现了标准 ImageView adapter 的样例:

遗憾的是,视图并不总是能够显示我们需要检查的状态。这里有一个在 TextView 上设置切换最大行的示例。它通过改变 TextView 的 maxLines 属性以及一个 延时布局转换 (android.view.ViewGroup)来实现切换。

这样你就可以了解它的作用

之前 binding adapter 比较简单并且总是设置了 maxLines 属性和一个点击监听对象。TextView 在 setMaxLines() 被调用后总会触发一次布局,这就意味着每次 binding adapter 启动,一次布局就会被触发。







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