这是我参与 8 月更文挑战的第 16 天,活动详情查看: 8月更文挑战
简介
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
使用
导入依赖包
在项目的根build中添加
allprojects {
repositories {
google()
}
}
在app级build目录下添加如下依赖
//livedata androidx
implementation "androidx.lifecycle:lifecycle-livedata:2.2.0"
创建LiveData对象
public class TestViewModel extends ViewModel {
private MutableLiveData<String> currentName;
public TestViewModel(){
currentName = new MutableLiveData<String>();
}
public MutableLiveData<String> getCurrentName() {
return currentName;
}
}
观察LiveData对象
在Activity或者Fragment中进行观察
TestViewModel viewModel = new ViewModelProvider(this).get(TestViewModel.class);
viewModel.getCurrentName().observe(this, new Observer<String>() {
@Override
public void onChanged(String currentName) {
//更新UI或者实现对应的逻辑
}
});
通过这种方式观察的LiveData对象仅在页面活跃的时候才会收到更新的消息, 如果有需求再界面不活跃的时候也需要收到消息, 可以使用
observeForever方法
viewModel.getCurrentName().observeForever(observer);
Observer observer = new Observer<String>() {
@Override
public void onChanged(String currentName) {
//更新UI或者实现对应的逻辑
}
};
通过这种方式观察的LiveData对象会一直存在, 为了防止内存泄漏, 一定要在
onDestroy方法中移除对应的监听
@Override
protected void onDestroy() {
super.onDestroy();
viewModel.getCurrentName().removeObserver(observer);
}
更新LiveData对象
设置完观察者后, 可以对LiveData对象进行更新, 可以在UI中更新,也可以在ViewModel中更新, 只要可以拿到LiveData对象都可以对其更新
- 在UI中更新 可以是当用户点击的时候进行更新
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String anotherName = "Your Name";
viewModel.getCurrentName().setValue(anotherName);
}
});
- 在ViewModel中更新
public void getUser(){
//对应的逻辑, 并更新
currentName.setValue("");
}
注意:
setValue方法仅能在主线程中更新LiveData对象, 如果想在子线程中更新LiveData对象, 需要用到postValue
- 在子线程中更新
public void getUser(){
//对应的逻辑, 并更新
currentName.postValue("");
}