android - 仅在特定条件下使用什么 RxJava 运算符来链接可观察对象

标签 android rx-java reactive-programming

我正在用 RxJava/Android 开发一个完整的应用程序,试图让事情尽可能地符合 Rx 方式。

我想我正在实现我想要的,但现在我遇到了一个问题,我确信存在更好的方法来做到这一点。 它包括:

  1. 从 Observable 获取 bool 值
  2. A:如果为真,则完成,返回真。 B:如果为假,则发出请求(称为 firstRequest)并接收 Observable。
  3. A:同理,如果为真,你就完了,返回真。 B:如果为假,则再发起一次请求(secondRequest)。
  4. A:如果它返回 true,那么你又完成了。如果为假,则启动 processFailed();

现在我已经以一种非常幼稚的方式(和次优的)实现了它:

public void startProcess(){
  dataRepository.getStatus()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(status -> {
      if(status){
        processCompleted();
      } else {
        makeFirstRequest();
      }
    });
}

private void makeFirstRequest(){
  dataRepository.firstRequest()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(status -> {
      if(status){
        processCompleted();
      } else {
        makeSecondRequest();
      }
    });
}

private void makeSecondRequest(){
  dataRepository.firstRequest()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(status -> {
      if(status){
        processCompleted();
      } else {
        processFailed();
      }
    });
}

我想知道如何以更有意义的方式组合这些操作(我查看了 combine,但我认为这不是预期的用例),并且订阅了三次我认为这是不对的。

我想到了 flatMapping(因为它返回一个 Observable 是有意义的),但是嵌套的操作链(flatMap inside flatMap in flatMap)让我认为必须有一种更简单的方法来使用一些操作符来实现相同的结果。

提前致谢。

最佳答案

flatMap 来拯救:

  dataRepository.getStatus()
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .flatMap(status -> status ? Observable.empty() : dataRepository.firstRequest())
  .flatMap(status -> status ? Observable.empty() : dataRepository.secondRequest())
  .defaultIfEmpty(false)
  .subscribe(status -> {
    if(status){
      processCompleted();
    } else {
      processFailed();
    }
  });

您还可以将 Observable.empty 替换为 Observable.just(status)

关于android - 仅在特定条件下使用什么 RxJava 运算符来链接可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39526978/

相关文章:

android - RxJava Android 在网络之前返回缓存

android - RXJava - 一个接一个地运行多个可观察对象(像 concat,但每个可观察对象都有 onCompleted)

android - Vitamio for Android的VideoView的 "setVideoHeaders"方法如何添加cookie?

android - 单击图像时动画不重复

android - 在android中启动应用程序后无法看到整个页面

android - Rx Java Android 中的混淆

android - Parse 服务是否需要 Google 帐户?

scala - combineLatest 仅在其中一个流发生变化时发出

transactions - 以 react 方式处理事务资源

database - Slick 3.0 在数据库驱动程序级别是响应式(Reactive)/异步的吗?适用于哪些数据库?