首页 > 解决方案 > 如何将 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);

如何改进此代码?我不想像我一样创建两个一次性用品。任何其他反馈或改进都非常受欢迎。

标签: androidrx-javarx-java2

解决方案


有一个 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);
              }...

我希望它有帮助,至少有点:)


推荐阅读