android - Livedata 观察者的多个实例
问题描述
我正在努力寻找一种解决方案,在一个活动中多次调用 livedata 观察者而不创建它的多个实例,这会导致当数据库更改时出现问题,我从所有实例中得到回调。
视图模型
public class RatingsViewModel extends AndroidViewModel {
private RatingsRepository ratingsRepository;
private LiveData<List<Rating>> ratingsList;
public RatingsViewModel(Application application) {
super(application);
ratingsRepository = new RatingsRepository(application);
}
public LiveData<List<Rating>> getRatingsByDate(LocalDate date) {
ratingsList = ratingsRepository.getActivitiesByDate(date);
return ratingsList;
}
活动
private void getRatingsByDate(LocalDate date) {
ratingsViewModel.getRatingsByDate(date).observe(this, activities -> {
// list populating stuff
});
}
我尝试调用 hasObserver() 但它返回 false 所以我无法删除观察者。
解决方案
您应该能够执行以下操作(在 Kotlin 中,但如果需要,应该可以轻松翻译成 Java)
val dateLiveData: MutableLiveData<Date> = MutableLiveData()
val ratingsList = MediatorLiveData<List<Rating>>().apply {
this.addSource(dateLiveData) {
this.value = ratingsRepository.getActivitiesByDate(dateLiveData.value)
}
}
fun setDate(date: Date) {
dateLiveData.value = date
}
例如,您会在活动/片段中调用observe
,然后在该值更改时调用。onCreate()
setDate()
推荐阅读
- reactjs - 从useState反应setState函数不更新状态值
- c++ - 求解函数在以下程序中不起作用
- c# - 无法更新通过数据集连接到数据库的行
- python - 如何在不改变数字位数的情况下从十进制转换为八进制?(Python)
- algorithm - 填充树的 Dp 方法和递归
- ios - NWConnection, 100% CPU 使用率和发送 512 UDP 数据包后崩溃
- docker - 在 Docker 容器内进行 VS Code 开发时启动 GUI 应用程序 (Firefox)
- c# - 为什么在添加运动控制器时角色会摔倒?
- audio - 有没有办法使用 Amplitude 类实时分析来自外部源的音频数据?
- r - Tidy multiple anovas