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);
    }
}