Какой поток будет использоваться при вызове subscribeOn внутри flatMapCompletable? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть завершаемый файл, который я создаю так:

public class Params {
    // Contains input parameters
}

public Completable startSomething(Params params) {
    return Completable
        .fromRunnable(() -> someMainThreadThing(params))
        .subscribeOn(this.schedulers.mainThread());
}

Теперь у меня есть источник, предоставляющий Single<Params>.Это предоставляется как часть API, поэтому текущий поток неизвестен во время подписки.Это использование выглядит примерно так:

public Completable doSomethingWithParams(Single<Params> params) {
    // Do something with the params
}

Я хотел бы реализовать doSomethingWithParams примерно так:

public Completable doSomethingWithParams(Single<Params> params) {
    return params.flatMapCompletable(::startSomething);
}

Мой вопрос: someMainThreadThing гарантированно будет выполняться наосновной поток, или настройка Single<Params> может повлиять на поток, в котором он выполняется?

1 Ответ

0 голосов
/ 20 ноября 2018

Согласно документации Single.flatMapCompletable()

flatMapCompletable не работает по умолчанию для определенного планировщика.

Это означает, что completablestartSomething() будет вызываться в том же планировщике (потоке), что и предыдущие цепные действия, если вы не вызываете явное переключение между планировщиками.

Для переключения между планировщиками вы можете использовать оператор observeOn().В вашем случае реактивная цепочка может выглядеть как

Single.fromCallable(getParams())
    .subscribeOn(Schedulers.io())
    .observeOn(this.schedulers.mainThread())
    .flatMapCompletable(::startSomething)

. В этом случае subscribeOn() заставляет выполнить getParams() на Schedulers.io(), после этого observeOn() переключается на основной поток и выполняет на нем startSomething().

...