RxJava, выполнить код в потоке наблюдателя перед цепочкой двух наблюдаемых

Я использую RxJava и RxAndroid и хочу объединить два наблюдаемых, но между ними мне нужно обновить пользовательский интерфейс, поэтому я должен выполнить код в основном потоке, прежде чем достичь подписчика.

Одним из решений вместо плоского сопоставления (это общепринятый термин?) двух наблюдаемых было бы вызвать следующее наблюдаемое в подписчике сразу после обновления пользовательского интерфейса, но я чувствую, что должно быть более элегантное решение, например:

myObservable
    .map(new Func1<Object, Object>() {
        @Override
        public Object call(Object object) {
            /* do stuff on the main thread */
            return object;
        }
    })
    .flatMap(new Func1<Object, Observable<OtherObject>>() {
        @Override
        public Observable<OtherObject> call(Object o) {
            return new MyOtherObservable(o);
        }
    })
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread());

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


person Dr NotSoKind    schedule 16.04.2015    source источник


Ответы (1)


Rxjava имеет оператор doOnNext, который вам нужен.

person dwursteisen    schedule 16.04.2015
comment
Это вызывается в потоке наблюдателя? В документации указано, что он не запускается в конкретном планировщике. - person Dr NotSoKind; 16.04.2015
comment
Вам нужно будет использовать наблюдение и указать планировщик - person dwursteisen; 16.04.2015
comment
Спасибо, так что, чтобы быть уверенным, это означает, что все, что я запускаю в doOnNext, будет выполняться в том же потоке, что и подписчик. - person Dr NotSoKind; 16.04.2015
comment
Только что проверил, doOnNext вызывается в другом потоке, в то время как подписчик вызывается в основном (используя наблюдение за основным потоком). - person Dr NotSoKind; 16.04.2015
comment
ObserveOn следует вызывать перед doOnNext - person dwursteisen; 16.04.2015