RxJava异步替代doOnNext

时间:2018-05-26 14:06:22

标签: rx-java

我希望使用RxJava进行长时间操作,而不是在订阅方法(或其他方式)上阻止使用它们。 longOperation()只是在DB中保存值,因此它不会影响值本身。我有以下代码:

Observable.interval(1, TimeUnit.SECONDS)
          .doOnNext { 
              value -> longOperation(value)
           }
          .subscribe {
              finalConsumer(it)  
           }

如何让它异步?

感谢。

3 个答案:

答案 0 :(得分:2)

使用flatMapsubscribeOn

Observable.interval(1, TimeUnit.SECONDS)
  .flatMap(value ->
      Completable.fromAction(() ->
        longOperation(value))
      .toObservable()
      .subscribeOn(Scheduler.io()))
  .subscribe {
     subscriber  
  }

您可能还希望通过用Schedulers.io()替换Schedulers.from(Executors.newFixedThreadPool(n))来约束调度程序。

答案 1 :(得分:0)

为什么不使用subscribeOn?如果您使用subscribeOn(Schedulers.io())并且未使用observeOn以上doOnNext,则您的代码将在IO线程中执行。

答案 2 :(得分:0)

这应该正常工作

Observable.interval(1, TimeUnit.SECONDS)
        .flatMap(value -> Observable.just(value)
                .mergeWith(Completable
                        .fromAction(() -> longOperation(value))
                        .subscribeOn(Schedulers.io())))
        .subscribe(finalConsumer(it));