android - 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 对象没有按预期工作吗?
解决方案
知道为什么我的 MediatorLiveData 对象没有按预期工作吗?
发生这种情况是因为 firstgetRandomTrail()
将被执行,返回一个MediatorLiveData
具有过时值的对象。只有在该方法执行完成后,下一个方法才能开始运行。因此,以下代码段永远不会及时完成,以从周围方法返回具有当前值的randomTrailgetRandomTrail()
:
trail -> {
if (trail == null) {
loadTrailsFromNetwork();
} else {
randomTrail.removeSource(currentRandomTrail);
randomTrail.postValue(trail);
}
}
处理这种情况的一种方法:
当您开始在 中加载当前数据时getRandomTrail()
,让randomTrail具有一些值,该值将被ViewModel
/ UI 识别为无效。这样,您可以防止显示过时的值 - 可能会显示某种类型的进度条。
推荐阅读
- javascript - 如何将 TinyMCE 的 textarea 中的内容直接传递给 PHP 文件,而不是通过 AJAX 发送?
- php - mysqli_query 未正确处理
- python - ValueError:尺寸必须相等,但“Attention_0/add”的尺寸必须是 49152 和 64(操作:“Add”)
- java - JavaxException 未知 SMTP 主机异常:mail.gmail.com
- momentjs - 如何在 kinesis 数据生成器模板中以纪元格式获取当前时间戳?
- android - 如何将 Cordova 项目作为模块或库添加到原生 Android 应用程序
- c - 这个是铸件吗,这是什么运算符
- couchbase - Cbtransfer 不起作用:{path} 处没有存储桶子目录
- python - 在不创建左右变量的情况下左加入熊猫
- ssas - 将与维度无关的度量值显示为“不适用”