Android MediatorLiveData在addSource';之前调用旧数据;s观察到的实时数据返回
下面是我存储库中的方法:Android MediatorLiveData在addSource';之前调用旧数据;s观察到的实时数据返回,android,mvvm,android-livedata,mediatorlivedata,Android,Mvvm,Android Livedata,Mediatorlivedata,下面是我存储库中的方法: public LiveData<Trail> getRandomTrail() { final LiveData<Trail> currentRandomTrail = trailDao.getRandomTrail(getMaxRefreshTime()); randomTrail.addSource(currentRandomTrail, trail -> { if (trail == null) {
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;
}
public LiveData getRandomTrail(){
最终LiveData currentRandomTrail=trailDao.getRandomTrail(getMaxRefreshTime());
randomTrail.addSource(currentRandomTrail,trail->{
if(trail==null){
loadTrailsFromNetwork();
}否则{
removeSource(currentRandomTrail);
随机化trail.postValue(trail);
}
});
返回随机轨迹;
}
这个问题是UI短暂地显示过时的数据,但我希望MediaLiveData对象randomTrail等待currentRandomTrail返回它的值。过时的数据首先出现,然后MediaLiveData对象更新。你知道为什么我的MediatorLiveData对象无法正常工作吗
你知道为什么我的MediatorLiveData对象无法正常工作吗
这是因为将执行第一个getRandomTrail()
,返回一个带有过期值的MediatorLiveData
对象。只有在完成此方法的执行后,下一个方法才能开始运行。因此,以下代码段将永远无法及时完成,无法从周围的方法getRandomTrail()
返回带有当前值的randomTrail:
处理这种情况的一种方法是:
当您开始在getRandomTrail()
中加载当前数据时,让randomTrail具有一些值,该值将被用户界面的ViewModel
/识别为无效。
这样,您就可以避免显示过时的值—可能会显示某种类型的progressbar。我只是在方法的开头添加了randomTrail.setValue(null),它就成功了!我还将以某种方式实现一个加载条。谢谢你的帮助。但是,这个问题正常吗?这似乎是一个解决办法。我想知道是否有更好的方法来设计代码以防止调用这个过时的值。@Amboseli-afaik这是正常行为。我见过的另一种更复杂的方法(在一些代码实验室中)是使用子类Success(这一个有一个类型为T的字段数据)、load和Error(这一个有一个类型为Throwable的字段)的泛型类结果。然后可以公开LiveData
trail -> {
if (trail == null) {
loadTrailsFromNetwork();
} else {
randomTrail.removeSource(currentRandomTrail);
randomTrail.postValue(trail);
}
}