基本概念
LiveData是一个可以被观察的数据持有类,它可以感知并遵循Activity、Fragment或Service等组件的生命周期。正是由于LiveData对组件生命周期可感知特点,因此可以做到仅在组件处于生命周期的激活状态时才更新UI数据。
LiveData需要一个观察者对象,一般是Observer
类的具体实现。当观察者的生命周期处于STARTED
或RESUMED
状态时,LiveData会通知观察者数据变化;在观察者处于其他状态时,即使LiveData的数据变化了,也不会通知。
LiveData可以使用如下方法注册观察者:
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
}
第一个参数为LifecycleOwner
,在新的兼容库中,Activity、Fragment等都实现了LifecycleOwner
接口。LifecycleOwner
可以获取Lifecycle
,从而得到组件的各生命周期状态。下面是LifecycleOwner
的源码定义:
/**
* A class that has an Android lifecycle. These events can be used by custom components to
* handle lifecycle changes without implementing any code inside the Activity or the Fragment.
*
* @see Lifecycle
*/
@SuppressWarnings({
"WeakerAccess", "unused"})
public interface LifecycleOwner {
/**
* Returns the Lifecycle of the provider.
*
* @return The lifecycle of the provider.
*/
@NonNull
Lifecycle getLifecycle();
}
第二个参数为观察者对象,当数据源变化时就会回调。Observer
的源码如下:
/**
* A simple callback that can receive from {@link LiveData}.
*
* @param <T> The type of the parameter
*
* @see LiveData LiveData - for a usage description.
*/
public interface Observer<T> {
/**
* Called when the data is changed.
* @param t The new data
*/
void onChanged(@Nullable T t);
}
通过LiveData的observe
方法进行关系绑定,就可以在组件的生命周期状态变为DESTROYED
时移除观察者,这样Activity或Fragment就可以安全地观察LiveData而不用担心造成内存泄露。
LiveData的优点
- 确保数据源跟UI展示一致——当数据源变化时,LiveData会通知观察者更新UI,前提是组件在激活状态下。
- 不会造成内存泄露——由于
Observer
跟LifecycleOwner
建立关系,从而可以获取生命周期状态,当组件生命周期状态为DESTROYED
时,会移除观察者。 - 当组件处于非激活状态时,不会收到数据更新回调。
- 无需手动处理生命周期——UI组件只需要观察对应的数据,LiveData根据其生命周期自动处理。
- 总是最新的数据——当Activity从后台切到前台时,总会收到最新的数据。
- 适配设备配置变化——如屏幕旋转,组件销毁重建后,立即收到上次的数据。
- 资源共享——参考【扩展LiveData】一节。
LiveData使用方法
使用LiveData的基本步骤:
- 在ViewModel中创建LiveData,并持有某种类型的数据。
- 创建一个
Observer
对象并实现其onChanged()
回调,一般在Activity或Fragment中创建Observer
。 - 在Activity或Fragment中通过LiveData的
observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer)
方法建立观察关系。
LiveData的
observeForever(@NonNull Observer<T> observer)
方法不需要传入LifecycleOwner
,这意味着是永久观察,无关生命周期状态,任何时候有数据更新都会回调onChanged()
。
创建LiveData
public class NameViewModel extends ViewModel {
// Create a LiveData with a String
private MutableLiveData<String> mCurrentName;
public MutableLiveData<String> getCurrentName() {
if (mCurrentName == null) {
mCurrentName = new MutableLiveData<String>();
}
return mCurrentName;
}
// Rest of the ViewModel...
}
一般LiveData都会在ViewModel中实现,MutableLiveData继承自LiveData,表示可变数据,提供了数据设置方法。
观察LiveData对象
通常在UI组件的onCreate()
中建立对LiveData的观察关系。下面的代码片段演示了如何观察LiveData对象:
public class NameActivity extends AppCompatActivity {
private NameViewModel mModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Other code to setup the activity...
// Get the ViewModel.
mModel = ViewModelProviders.of