LiveData 是 ViewModel 用来“安全地通知 UI 层更新”的方式。
- ViewModel 中定义与更新 LiveData
public class MyViewModel extends ViewModel {
private final MutableLiveData
public LiveData<String> getMessageLiveData() {
return messageLiveData;
}
public void updateMessage(String msg) {
messageLiveData.setValue(msg); // 主线程使用 setValue()
// messageLiveData.postValue(msg); // 子线程也可以用 postValue()
}
}
2. Activity/Fragment 中观察 LiveData
MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
viewModel.getMessageLiveData().observe(this, message -> {
textView.setText(message); // UI 自动刷新
});
3. LiveData 常用操作
方法 说明
setValue() 主线程更新数据
postValue() 子线程更新数据
observe() 观察数据变化(生命周期感知)
observeForever() 永久观察(需手动移除,慎用)
🔁 和 RxJava 比较
特性 LiveData RxJava
生命周期感知 ✅ 内建 ❌ 需手动配合如 RxLifecycle
学习成本 ✅ 简单 ❌ 复杂,操作符多
功能丰富 ❌ 仅支持数据通知 ✅ 支持变换、合并、背压等复杂操作
UI 通知 ✅ 主线程安全 ✅ 手动指定线程
推荐组合用法:业务逻辑用 RxJava,最终结果放入 LiveData 中供 UI 层观察。
🧱 高阶用法
- MediatorLiveData
观察多个 LiveData 源,合并逻辑:
MediatorLiveData
result.addSource(liveData1, value -> {
result.setValue(“来自 liveData1: “ + value);
});
result.addSource(liveData2, value -> {
result.setValue(“来自 liveData2: “ + value);
});
2. SingleLiveEvent(防止重复触发)
防止如“跳转页面”这种事件被重复触发,常自定义如下:
public class SingleLiveEvent
private final AtomicBoolean pending = new AtomicBoolean(false);
@Override
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
super.observe(owner, t -> {
if (pending.compareAndSet(true, false)) {
observer.onChanged(t);
}
});
}
@MainThread
public void setValue(T t) {
pending.set(true);
super.setValue(t);
}
}
🧭 总结:LiveData 用在哪里?
场景 是否推荐用 LiveData
后台网络请求结果通知 UI ✅ 推荐
定时更新状态(配合 RxJava) ✅ 推荐
复杂数据链式变换 ❌ 用 RxJava 更合适
临时事件(弹窗、跳转) ✅ 用 SingleLiveEvent