LiveData 是一个可以被观察的数据持有类,它可以感知 Activity、Fragment或Service 等组件的生命周期。它可以做到在组件处于激活状态的时候才会回调相应的方法,从而刷新相应的 UI。不用担心发生内存泄漏。当 config 导致 activity 重新创建的时候,不需要手动取处理数据的储存和恢复。它已经帮我们封装好了。当 Actiivty 不是处于激活状态的时候,如果你想 livedata setValue 之后立即回调 obsever 的 onChange 方法,而不是等到 Activity 处于激活状态的时候才回调 obsever 的 onChange 方法,你可以使用 observeForever 方法,但是你必须在 onDestroy 的时候 removeObserver。
用于解决当网络请求结果回来的时候,要判断 Activity 或者 Fragment 是否已经 Destroy, 如果不是 destroy,更新 UI。使用 Livedata ,因为它是在 Activity 处于 onStart 或者 onResume 的状态时,他才会进行相应的回调,因而可以很好得处理这个问题,不必谢一大堆的 activity.isDestroyed()。
1.引入相关的依赖包
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.0"
// alternatively, just ViewModel
implementation "android.arch.lifecycle:viewmodel:1.1.0"
// alternatively, just LiveData
implementation "android.arch.lifecycle:livedata:1.1.0"
2.在代码中使用
LiveData 是一个抽象类,它的实现子类有 MutableLiveData ,MediatorLiveData。在实际使用中,用得比较多的是 MutableLiveData。他常常结合 ViewModel 一起使用。
首先,我们先写一个类继承我们的 ViewModel,里面持有 mNameEvent。
public class TestViewModel extends ViewModel {
private MutableLiveData mNameEvent = new MutableLiveData<>();
public MutableLiveData getNameEvent() {
return mNameEvent;
}
}
接着,我们在 Activity 中创建 ViewModel,并监听 ViewModel 里面 mNameEvent 数据的变化,当数据改变的时候,我们打印相应的 log,并设置给 textView,显示在界面上。这样我们就完成了对 mNameEvent 数据源的观察。
mTestViewModel = ViewModelProviders.of(this).get(TestViewModel.class);
MutableLiveData nameEvent = mTestViewModel.getNameEvent();
nameEvent.observe(this, new Observer() {
@Override
public void onChanged(@Nullable String s) {
Log.i(TAG, "onChanged: s = " + s);
mTvName.setText(s);
}
});
最后当我们数据源改变的时候,我们需要调用 livedata 的 setValue 或者 postvalue 方法。
他们之间的区别是, 调用 setValue 方法,Observer 的 onChanged 方法会在调用 serValue 方法的线程回调。而postvalue 方法,Observer 的 onChanged 方法将会在主线程回调。
mTestViewModel.getNameEvent().setValue(name);
ViewModel 是通过 ViewModelProviders.of(this).get(TestViewModel.class); 方法创建出来的,如果我们要携带参数,调用 ViewModelProvider of(@NonNull Fragment fragment, @Nullable Factory factory) 方法,多传递一个 factory 参数。Factory 是一个接口,它只有一个 create 方法。
public interface Factory {
/**
* Creates a new instance of the given {@code Class}.
*
*
* @param modelClass a {@code Class} whose instance is requested
* @param The type parameter for the ViewModel.
* @return a newly created ViewModel
*/
@NonNull
T create(@NonNull Class modelClass);
}
在实际当中,我们的做法是:实现 Factory 接口,重写 create 方法,在create 方法里面调用相应的构造函数,返回相应的实例。
public class TestViewModel extends ViewModel {
private final String mKey;
private MutableLiveData mNameEvent = new MutableLiveData<>();
public MutableLiveData getNameEvent() {
return mNameEvent;
}
public TestViewModel(String key) {
mKey = key;
}
public static class Factory implements ViewModelProvider.Factory {
private String mKey;
public Factory(String key) {
mKey = key;
}
@Override
public T create(Class modelClass) {
return (T) new TestViewModel(mKey);
}
}
public String getKey() {
return mKey;
}
}
ViewModelProviders.of(this, new TestViewModel.Factory(mkey)).get(TestViewModel.class)