android - 如何将 RxJava 代码改进为 API 和本地缓存?
问题描述
我有这段代码,我从缓存中获取照片,然后我需要从 API 获取照片。
Disposable disposable = photosCacheRepository.getPhotoAttachments(workOrderId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(photoAttachments -> {
Disposable disposable1 = workOrdersRepository.getWorkOrderDetails(workOrderId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(workOrderDetails -> {
List<PhotoAttachment> photos = new ArrayList<>();
photos.addAll(photoAttachments);
photos.addAll(workOrderDetails.getAppointmentOccurrence().getPhotoAttachments());
if (photos.isEmpty()) {
view.displayNoWorkOrderPhotos();
} else {
view.displayWorkOrderPhotos(photos);
}
});
disposables.add(disposable1);
});
disposables.add(disposable);
如何改进此代码?我不想像我一样创建两个一次性用品。任何其他反馈或改进都非常受欢迎。
解决方案
有一个 RxJava 运算符可以满足您的需要。它被称为 flatMap(此处为 Marbles 和操作员信息)。
使用这个强大的运算符,您可以将第一个 Observable 的输出作为 flatMap 创建的那个的输入,然后将其作为 Observable 返回。
对不起,我真的不习惯java,所以下面的代码几乎可以肯定是行不通的,但只是为了提出一个想法......
在您的示例中,您可以执行以下操作:
Disposable disposable = photosCacheRepository.getPhotoAttachments(workOrderId)
.subscribeOn(Schedulers.io())
.flatmap(photoAttachments -> {
workOrdersRepository.getWorkOrderDetails(workOrderId)
.map(workOrderDetails -> {
List<PhotoAttachment> photos = new ArrayList<>();
photos.addAll(photoAttachments);
photos.addAll(workOrderDetails.getAppointmentOccurrence().getPhotoAttachments());
return photos;
.ObserveOn(AndroidSchedulers.mainThread())
.subscribe(photos -> {
if (photos.isEmpty()) {
view.displayNoWorkOrderPhotos();
} else {
view.displayWorkOrderPhotos(photos);
}...
我希望它有帮助,至少有点:)
推荐阅读
- entity-framework - 在 DBFirst 场景中,在映射中添加 .HasIndex() 有什么好处?
- jasper-reports - 如何用一条线覆盖所有的细节空间
- ios - 归档 iOS 应用程序时出错 - “通用专业化”
Swift.String.init 的" - activemq - 如何使我的上次映像恢复策略主题在代理重新启动后仍然存在?
- docker - 如何更正makefile中的docker,它需要至少1个参数来删除所有容器命令
- sharepoint-online - 使用作者/电子邮件使用 SharePoint REST API 进行查询
- javascript - JS Canvas 游戏使用按键事件来修改按住 shift 按钮时的速度
- php - 如何在 Laravel 中创建用户和帖子之间的关系
- r - 尝试在 R 中绘制复杂函数时出现错误消息
- java - 当您在 Triemap 上使用 Hashmap 时会发生什么情况?