MediatorLiveData在addSource观察到的LiveData返回之前调用旧数据

时间:2020-04-18 20:24:55

标签: android mvvm android-livedata mediatorlivedata

下面是我存储库中的方法:

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对象无法正常工作了吗?

1 个答案:

答案 0 :(得分:1)

为什么我的MediatorLiveData对象无法正常工作?

发生这种情况是因为将首先执行getRandomTrail(),并返回一个具有过期值的MediatorLiveData对象。仅在该方法的执行完成之后,下一个方法才能开始运行。因此,以下代码段将永远无法及时完成以返回带有周围方法getRandomTrail()的当前值的 randomTrail

trail -> {
    if (trail == null) {
        loadTrailsFromNetwork();
    } else {
        randomTrail.removeSource(currentRandomTrail);
        randomTrail.postValue(trail);
    }
}

一种处理这种情况的方法:

当您开始在getRandomTrail()中加载当前数据时,让 randomTrail 具有一些值,这些值将被ViewModel / UI识别为无效。 这样,您可以防止显示过时的值-也许可以显示某种类型的进度条。