在阅读了多篇博文和文档之后,我得出结论,doOnSubscribe
将在工作线程上执行:
Observable.just(1)
.observeOn(Schedulers.io())
.doOnSubscribe(__ -> Log.d("Testing", "Testing")) // Shouldn't this be on worker thread?
.subscribe();
但是在调试之后,我看到doOnSubscribe
在主线程上执行。我认为doOnSubscribe
与其他运算符类似,因此在与subscribeOn
和observeOn
结合时具有类似的线程行为。
我错过了什么?如何将doOnSubscribe
执行移至后台线程?
答案 0 :(得分:11)
subscribeOn
和observeOn
对doOnSubscribe
没有影响,因为运算符之间的连接是在调用方线程上建立的,以便支持立即取消。您必须以某种方式将订阅推迟到doOnSubscribe
,例如:
Observable.defer(() ->
Observable.just(1)
.doOnSubscribe(s -> Log.d("Testing", "Testing"))
)
.subscribeOn(Schedulers.io())
.subscribe();
或
Observable.just(1)
.subscribeOn(Schedulers.io())
.flatMap(v ->
Observable.just(1)
.doOnSubscribe(s -> Log.d("Testing", "Testing"))
)
.subscribe()
答案 1 :(得分:0)
默认情况下,doOnSubscribe
在当前线程上执行。要更改执行doOnSubscribe
的线程,请在其下方放置subscribeOn
。经过rxjava2
版2.2.14
Observable.just(1)
.doOnSubscribe(s -> System.out.println("doOnSubscribe thread " + Thread.currentThread().getName())) //IO thread
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.subscribe(s -> {
System.out.println("subscribing thread " + Thread.currentThread().getName());//Computation thread
});
Thread.sleep(100);