Android 架构组件中的数据绑定概述
本文描述了数据绑定和 MVVM 设计模式及其组件背后的思想。如果您想亲自试验它,请打开一个带有意大利面条式代码的旧项目。如果你没有,你会从 GitHub 得到一个。然后,尝试使用本文中介绍的 MVVM 组件。
在某些方面,软件开发在过去十年中没有太大变化。基本挑战保持不变:
- 编写干净的代码。
- 拥有多功能架构。
- 测试代码。
- 创造卓越的用户体验。
- 开发功能的速度比产品管理可以考虑的更快 🙂
当Android进入市场时,所有这些问题都有了答案。桌面和 Web 应用程序开发人员已经拥有用于编写用户界面的知识领域。这些解决方案也适用于 Android,但离理想还很远。
Android 最初支持Java ,应用程序通常使用 MVC(模型视图控制器)实现。十年后,Kotlin 出现了……还有 MVVM 和数据绑定。因此,这十年是一段漫长的旅程,所以让我们赶上吧!
使用数据绑定
作为单一术语的数据绑定是指连接来自最终消费者和用户的数据并使它们保持同步的技术。 Android 的数据绑定库允许开发人员将 UI 保留在布局 XML 文件中并从中生成代码。该库还负责将 View 与来自 ViewModel 的数据同步。为了将数据绑定添加到您的原生 android 项目,您需要将以下行添加到您的应用程序的 build.gradle 文件中:
android {
...
dataBinding {
enabled = true
}
}
将 dataBinding 元素设为“true”后,您需要将其添加到您的 XML 文件中,例如:
XML
Java
class ViewModelActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// Inflating the view to obtain an instance
UserBinding binding = DataBindingUtil.setContentView(this, R.layout.gfg);
// Specifying the present (current) activity as the parent
binding.setLifecycleOwner(this);
}
}
Kotlin
class ViewModelActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Inflating the view to obtain an instance
val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.gfg)
// Specifying the present (current) activity as the parent
binding.setLifecycleOwner(this)
}
}
将上述代码添加到 XML 后,您可以使用LiveData通知 UI 有关数据更改的信息:
与实现 Observable 元素的对象不同,例如:Observable Text Fields,Live Data 对象实现订阅信息变化的观察者的生命周期。这些数据带来了许多好处,这些好处在使用 LiveData 的好处中得到了解释。在 Android Studio 3.1 及更高版本中,您将在数据绑定代码中用 LiveData 对象替换可观察字段。
Java
class ViewModelActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// Inflating the view to obtain an instance
UserBinding binding = DataBindingUtil.setContentView(this, R.layout.gfg);
// Specifying the present (current) activity as the parent
binding.setLifecycleOwner(this);
}
}
科特林
class ViewModelActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Inflating the view to obtain an instance
val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.gfg)
// Specifying the present (current) activity as the parent
binding.setLifecycleOwner(this)
}
}
为什么要绑定到 LiveData?
采用 LiveData 等生命周期感知组件的优势包括:
- 由于停止活动,没有崩溃。如果观察者的生命周期处于非活动状态,例如当活动在后台堆栈中时,则它不会收到任何 LiveData 事件。
- 适当的配置更改。如果由于配置更改(例如,设备旋转、角度更改等)而重新创建活动或片段,它会立即接收最新的可用数据。
- 没有内存泄漏。无需手动处理订阅。当观察者相关的生命周期被销毁时,观察者会自行打包。
警告
使用双向数据绑定时注意不要引入无限循环。当用户更改属性时,将命名策略注释@InverseBindingAdapter 。反过来,这将调用带注释的策略@BindingAdapter ,这可能会触发对带注释的策略@InverseBindingAdapter 的另一个调用,依此类推。因此,通过比较@BindingAdapter注释的方法中的新旧值来中断可能的无限循环很重要。
一些最后的想法
Android 组件的生命周期很复杂,手动管理可能会很痛苦,因为要保持 UI 与数据源保持同步,因此引入 LiveData,可能会大大加强生命周期管理。在考虑到配置和生命周期状态的情况下,数据源中的更改通常会自动传播到 UI,因此将数据绑定添加到项目中可以使代码更加简洁和反应性。但是,您使用数据绑定库不应仅限于将知识模型的属性设置到文本字段中。使用单向和双向绑定绑定到 LiveData 将使您能够形成最重要的观察者模式和生命周期意识。