首页 > 解决方案 > doOnSubscribe 在主线程上被调用

问题描述

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

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

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

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

标签: androidreactive-programmingrx-java2

解决方案


subscribeOn并且observeOn没有影响,doOnSubscribe因为运算符之间的连接是在调用者线程上建立的,以支持立即取消。您必须以某种方式推迟对 a 的订阅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()

推荐阅读