首页 > 解决方案 > MediatorLiveData 在 addSource 观察到的 LiveData 返回之前调用旧数据

问题描述

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

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 对象没有按预期工作吗?

标签: androidmvvmandroid-livedatamediatorlivedata

解决方案


知道为什么我的 MediatorLiveData 对象没有按预期工作吗?

发生这种情况是因为 firstgetRandomTrail()将被执行,返回一个MediatorLiveData具有过时值的对象。只有在该方法执行完成后,下一个方法才能开始运行。因此,以下代码段永远不会及时完成,以从周围方法返回具有当前值的randomTrailgetRandomTrail()

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

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

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


推荐阅读