在主线程上调用doOnSubscribe

Dhr*_*iya 6 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();
Run Code Online (Sandbox Code Playgroud)

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

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

aka*_*okd 14

subscribeOnobserveOn有没有影响doOnSubscribe,因为运营商之间的连接,以便支持立即取消来电线程上建立的.您必须以doOnSubscribe某种方式将订阅推迟到a ,例如:

Observable.defer(() ->
    Observable.just(1)
    .doOnSubscribe(s -> Log.d("Testing", "Testing"))
)
.subscribeOn(Schedulers.io())
.subscribe();
Run Code Online (Sandbox Code Playgroud)

要么

Observable.just(1)
.subscribeOn(Schedulers.io())
.flatMap(v ->
    Observable.just(1)
    .doOnSubscribe(s -> Log.d("Testing", "Testing"))
)
.subscribe()
Run Code Online (Sandbox Code Playgroud)


Bek*_*Bek 5

默认情况下doOnSubscribe在当前线程上执行。doOnSubscribe要更改执行的线程,请将其放在subscribeOn其下方。

 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);
Run Code Online (Sandbox Code Playgroud)