LiveData是一种可观察监听的数据存储类,当生命周期发生、数据有更新时,observer可感知监听到。
LiveData是最好跟ViewModel配合使用,而MutableLiveData继承LiveData,所以使用时可以直接用MutableLiveData
LiveData只有观察者的生命周期处于活跃状态时才会去通知观察者,比如started,resumed
- 不会发生内存泄漏: observer会在LifecycleOwner状态变为DESTROYED后自动remove;
- 不会因 Activity 停止而导致崩溃:如果LifecycleOwner生命周期处于非活跃状态,则它不会接收任何 LiveData事件;
- 不需要手动解除观察:能自动管理生命周期
- 数据始终保持最新状态:数据更新时 若LifecycleOwner为非活跃状态,那么会在变为活跃时接收最新数据;
在ViewModel:
public class SimpleViewModel extends ViewModel {
private MutableLiveData<String> content;
public MutableLiveData<String> getContent() {
if (content == null) {
content = new MutableLiveData<>();
}
return content;
}
public void setContent(MutableLiveData<String> content) {
this.content = content;
}
/**
* 获取数据
*/
public void getContentData() {
//这里可以加一层Repository从网络/缓存加载数据
//执行完毕后调用 setValue/postValue方法,最终会回调Activity中的onChange方法
content.setValue("我是获取到的数据");
//子线程调用 content.postValue(""我是获取到的数据");
}
}
在Activity或是fragment进行监听观察:
//构建ViewModel对象
final SimpleViewModel model = ViewModelProviders.of(this).get(SimpleViewModel.class);
//监听content属性变化,只要触发了setValue/postValue方法就会走
model.getContent().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
Log.e("SimpleActivity", "onChanged");
btn.setText(s);
}
});
//起始点
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发起获取数据
model.getContentData();
}
});