RXJava2:平面图用法

时间:2018-12-17 19:36:52

标签: java android rx-java retrofit2 rx-java2

我有以下情况,在这种情况下,一旦我从zip(getHardwareInfo)获得服务响应,就需要进行另一个服务调用(getSoftwareInfo())。因此,基本上只有在getHardwareInfo()成功的情况下才会调用getSoftwareInfo()。

-现在,我想添加一个条件,不仅要在成功获取getHardwareInfo之后调用getSoftwareInfo(),还要满足条件(即isChristmas())。我已经将代码从版本1更改为版本2,并且可以正常工作。我已经调试了它,看起来工作正常。由于我是rxjava的新手,因此不确定我是否正确执行了操作。任何帮助将不胜感激。

版本1:

public Single<ComputerData> getComputerData(){
 return getHardwareInfo().observeOn(AndroidSchedulers.mainThread())
           .onErrorREsumeNext(throwable->{ 
            return Single.error() 
        }).flatMap(hardwareInfo->{
           //do something with hardwareInfo
           return getSoftwareInfo();
        .observeOn(AndroidSchedulers.mainThread())
        .onErrorResumeNext(throwable->{
         return Single.error());
         })
         .flatMap(softwareInfo->{
           //do something with softwareInfo
         });

版本2:

public Single<ComputerData> getComputerData(){
 return getHardwareInfo().observeOn(AndroidSchedulers.mainThread())
           .onErrorREsumeNext(throwable->{ 
            return Single.error() 
        }).flatMap(hardwareInfo->{
           //do something with hardwareInfo
          if(isChristmas()){
           return getSoftwareInfo()
                 .observeOn(AndroidSchedulers.mainThread());
                 .onErrorResumeNext(throwable->{
                  return Single.error());
                  })
                  .flatMap(sofwareInfo->{
                  //do something with softwareInfo
                  });
          } else{
                //do something else.
           }
         });

1 个答案:

答案 0 :(得分:0)

如果您只想返回错误,则不需要onErrorResumeNext

就这样:

getHardwareInfo()
    .flatMap(hi -> getSoftwareInfo())
    .filter(si -> isChristmas());

您只需要添加适当的调度程序