我有此代码,可以从缓存中获取照片,然后再从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 and operator info here)。
使用此功能强大的运算符,您可以获取第一个Observable的输出作为flatMap创建的输入的输入,然后将其作为Observable返回。
对不起,我不太习惯Java,因此下面的代码几乎可以肯定不会起作用,只是想出一个主意...
在您的示例中,您可以执行以下操作:
Disposable disposable = photosCacheRepository.getPhotoAttachments(workOrderId)
.subscribeOn(Schedulers.io())
.flatmap(photoAttachments -> {
workOrdersRepository.getWorkOrderDetails(workOrderId)
.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);
}...
我希望至少有帮助:)