我希望使用RxJava进行长时间操作,而不是在订阅方法(或其他方式)上阻止使用它们。 longOperation()只是在DB中保存值,因此它不会影响值本身。我有以下代码:
Observable.interval(1, TimeUnit.SECONDS)
.doOnNext {
value -> longOperation(value)
}
.subscribe {
finalConsumer(it)
}
如何让它异步?
感谢。
答案 0 :(得分:2)
使用flatMap
和subscribeOn
:
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));