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

标签 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对象不能正常工作吗?

最佳答案

Any idea why my MediatorLiveData object is not working how expected?



发生这种情况是因为将执行第一个getRandomTrail(),并返回带有过期值的MediatorLiveData对象。仅在该方法的执行完成之后,下一个方法才能开始运行。因此,以下代码段将永远无法及时完成,以从周围的getRandomTrail()方法返回具有当前值的randomTrail:
trail -> {
    if (trail == null) {
        loadTrailsFromNetwork();
    } else {
        randomTrail.removeSource(currentRandomTrail);
        randomTrail.postValue(trail);
    }
}

解决这种情况的一种方法:

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

关于android - MediatorLiveData在addSource观察到的LiveData返回之前调用旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61295749/

相关文章:

android - 是否可以强制 LiveData 值的不可空性?

android - 如何将数据从 Unity 场景传递到 Android Activity

wpf - Prism Mvvm Mef Interactivity 打开窗口新实例

mvvm - Xamarin表格: For what kind of projects is Reactive UI preferable?

c# - Xamarin 在哪里执行绑定(bind)表达式?

android - 如何在 Kotlin 中将 MutableLiveData<Boolean>() 的值设置为不利?

android - OpenCV 合并两个掩码

php - 使用 Android PHP Web 服务从服务器获取数组

cloudbees 上的 jenkins 导致 android gradle 构建失败

android - 带 LiveData 的 ViewModel 与不带 LiveData 的 ViewModel 有何不同?