下面是我存储库中的方法:
public LiveData<Trail> getRandomTrail() {
final LiveData<Trail> currentRandomTrail = trailDao.getRandomTrail(getMaxRefreshTime());
randomTrail.addSource(currentRandomTrail, trail -> {
if (trail == null) {
loadTrailsFromNetwork();
} else {
randomTrail.removeSource(currentRandomTrail);
randomTrail.postValue(trail);
}
});
return randomTrail;
}
问题是UI会短暂显示过时的数据,但是我希望MediatorLiveData对象randomTrail等待,直到currentRandomTrail返回其值。首先显示过时的数据,然后更新MediatorLiveData对象。知道为什么我的MediatorLiveData对象不能正常工作吗?
最佳答案
Any idea why my MediatorLiveData object is not working how expected?
发生这种情况是因为将执行第一个
getRandomTrail()
,并返回带有过期值的MediatorLiveData
对象。仅在该方法的执行完成之后,下一个方法才能开始运行。因此,以下代码段将永远无法及时完成,以从周围的getRandomTrail()
方法返回具有当前值的randomTrail:trail -> {
if (trail == null) {
loadTrailsFromNetwork();
} else {
randomTrail.removeSource(currentRandomTrail);
randomTrail.postValue(trail);
}
}
解决这种情况的一种方法:
当您开始在
getRandomTrail()
中加载当前数据时,让randomTrail具有一些值,该值将被ViewModel
/UI识别为无效。这样,您可以防止显示过时的值-也许显示某种类型的进度条。
关于android - MediatorLiveData在addSource观察到的LiveData返回之前调用旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61295749/