RxJava onCompleted и onTerminate на главном потоке

я использую RxJava с Retrofit 2.0 на Android для сетевых запросов.

когда я создаю наблюдаемое, я добавляю к нему следующее:

observable = observable
    .observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(Schedulers.io())
    .unsubscribeOn(Schedulers.io())

тогда, если я добавить:

observable = observable.doOnTerminate(new Action0() {
                @Override
                public void call() {
                    Log.d("OBS", "[" + Thread.currentThread().getName() + "] onTerminate");
                }
            });

на doOnError и doOnCompleted обратные вызовы выполняются в потоке ввода-вывода, в то время как doOnNext выполняется в основном потоке.

однако я действительно хочу, чтобы все обратные вызовы шли в основной поток, но выполнение должно оставаться на IO нитка.

есть ли элегантное решение для этого без необходимости вручную обернуть мои реализации блоком, чтобы опубликовать что-то в основной поток?

1 ответов


вы должны разместить свои обратные вызовы перед любым observeOn поэтому они останутся в предыдущем потоке:

Observable.range(1, 10)
.subscribeOn(Schedulers.io())
.doOnTerminate(() -> System.out.println(Thread.currentThread()))
.map(v -> v + 1)
.observeOn(AndroidSchedulers.mainThread())
.map(v -> Thread.currentThread() + " / " + v)
.doOnNext(v -> Log.d("OBS", v))
.subscribe();