在主线程上调用doOnSubscribe

时间:2018-04-28 10:37:13

标签: android reactive-programming rx-java2

在阅读了多篇博文和文档之后,我得出结论,doOnSubscribe将在工作线程上执行:

Observable.just(1)
            .observeOn(Schedulers.io())
            .doOnSubscribe(__ -> Log.d("Testing", "Testing")) // Shouldn't this be on worker thread?
            .subscribe();

但是在调试之后,我看到doOnSubscribe在主线程上执行。我认为doOnSubscribe与其他运算符类似,因此在与subscribeOnobserveOn结合时具有类似的线程行为。

我错过了什么?如何将doOnSubscribe执行移至后台线程?

2 个答案:

答案 0 :(得分:11)

subscribeOnobserveOndoOnSubscribe没有影响,因为运算符之间的连接是在调用方线程上建立的,以便支持立即取消。您必须以某种方式将订阅推迟到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。经过rxjava22.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);