doOnSubscribe вызывается в главном потоке - PullRequest
0 голосов
/ 28 апреля 2018

Прочитав несколько постов в блоге и документацию, я пришел к выводу, что в рабочем потоке будет выполнено следующее 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 выполнение в фоновый поток?

1 Ответ

0 голосов
/ 28 апреля 2018

subscribeOn и observeOn не влияют на doOnSubscribe, поскольку соединение между операторами устанавливается в потоке вызывающего абонента для поддержки немедленного отмены. Вы должны каким-то образом отложить подписку до doOnSubscribe, например ::10000

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()
...