使用LiveData和数据绑定
随着Android体系结构组件的稳定,我开始将所有的基本ViewModel
更新为ViewModel
的新实现。 在我的理解中,建议使用LiveData
来保存Model
类,因为它更好地处理生命周期。
我喜欢使用Data Binding
因为它使得代码在Java / Kotlin方面更加清晰,并且不需要“观察”值更改来更新UI。 然而,如果Model
(或ViewModel)扩展了BaseObservable
而LiveData
则不扩展, LiveData
使用Data Binding
的布局只能监视数据的变化。 我明白LiveData
的主要目标之一是观察和更新用户界面编程,但对于简单的更新, Data Binding
是非常有用的。
这个问题已经被报道( GitHub和堆栈溢出 ),首先是说1.0版本会有,现在说这个function正在开发中。
为了同时使用LiveData
和Data Binding
,我创建了一个扩展BaseObservable
类的非常简单的实现:
import android.arch.lifecycle.LiveData import android.arch.lifecycle.MutableLiveData import android.databinding.BaseObservable class ObservableMutableLiveData() : BaseObservable() { private var data: MutableLiveData = MutableLiveData() constructor(data: T) : this() { this.data.value = data } public fun set(value: T) { if (value != data.value) { data.value = value notifyChange() } } public fun get(): T? { return data.value } public fun getObservable(): LiveData { return data } }
所以基本上我的ObservableMutableLiveData
是使用LiveData
来存储模型的ObservableField
的副本,并且在这个实现中,每次模型更新后布局都会更新。
问题是:
- 这是一个糟糕的
LiveData
实现? 这个包装是否“打破”了LiveData
的function,比如生命周期感知? - 据我了解,
LiveData
是新的ObservableField
。 它是否正确?
Android Studio 3.1(目前在Canary 6中)将解决这个问题,因为LiveData
可以用作observable field
:
数据绑定更新:
您现在可以在数据绑定expression式中将LiveData对象用作可观察字段。 ViewDataBinding类现在包含一个新的setLifecycle方法,您需要使用它来观察LiveData对象。
来源: Android Studio 3.1 Canary 6现在可用