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

MediatorLiveData calls old data before addSource's observed LiveData returns

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

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() 将被执行,returning 具有过时值的 MediatorLiveData 对象。只有在这个方法执行完之后,下一个方法才能开始运行。因此,以下代码段将永远不会及时完成 return randomTrail 周围方法的当前值 getRandomTrail():

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

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

当您开始加载 getRandomTrail() 中的当前数据时,让 randomTrail 具有一些值,该值将被 ViewModel/ UI。 这样,您就可以防止显示过时的值 - 可能会显示某种类型的进度条。