Как вы связываете несколько наблюдаемых?

Допустим, я хочу показать некоторые пользовательские данные, которые находятся на сервере. Я бы искал сервер, кэшировал его, а затем представлял пользователю. Итак, мой исходный код RxJava будет выглядеть примерно так:

 ApiClient.getUser(userId), //An Observable that will spit out a UserResponse
    .subscribeOn(Schedulers.io()) //for the API observable (Do i need this?)
    .flatMap(new Func1<UserResponse, Observable<DatabasePutResult>>() {
          @Override
           public Observable<DatabasePutResult> call(UserResponse response) {
                return Database.cacheUser(response);
             }
          })
    .subscribeOn(Schedulers.io()) //for the database observable
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(//handle DatabasePutResult object in onNext());

Теперь у меня есть два вопроса.

  1. Это правильный способ связать два Observables? Если нет, то как мне быть?
  2. Если бы я хотел обработать onError для Api Observable, смог бы я как-то это сделать, поддерживая цепочку? Если нет, то как лучше всего это сделать? Мне действительно нужно разделить цепочку на два набора вызовов RxJava?

person Sree    schedule 09.11.2015    source источник


Ответы (1)


  1. Вам не нужно это:

.subscribeOn(Schedulers.io()) //for the API observable (Do i need this?)

Если вам интересно, вы можете проверить идентификатор текущего потока по этому коду:

Thread.currentThread().getId();
В остальном все было в порядке.

  1. Вы должны посмотреть на это: Error-Handling- Операторы. В таком случае я бы посоветовал присмотреться к onErrorResumeNext( )

Надеюсь, это будет полезно.

person Dmitry Ok    schedule 10.11.2015
comment
поэтому, если я правильно понимаю, я должен использовать onErrorResumeNext(), если я хочу попробовать похожий, но другой наблюдаемый (другой наблюдаемый, который выдает тот же результат), но если я хочу обработать ошибку этого наблюдаемого, я могу сделать это в onError() внутри подписки проверив if(e instanceof SomeException) - person Sree; 10.11.2015
comment
А что, если у вас есть две наблюдаемые, которые генерируют одно и то же исключение. Например, что, если бы у меня был сетевой вызов, и на основе этого результата я выполняю другой сетевой вызов. Оба могут генерировать HttpException. Вы не можете использовать if(e instanceof SomeException). Что бы вы предложили в этом сенарио? - person Sree; 10.11.2015
comment
@Sree ApiClient.getUser(userId) Он будет генерировать только одно событие onNext или одно событие onError, если я правильно понял ваш фрагмент кода (вы используете Retrofit, верно?). - person Dmitry Ok; 11.11.2015
comment
да, но я просто использовал это как пример. Что произойдет, если я сделаю ApiClient.getUser(userid).flatmap(//some other api call) - person Sree; 11.11.2015
comment
все зависит от логики которая вам нужна, можете написать так ApiClient.getUser(userid).onErrorResumeNext(...).flatMap( v-> ApiClient.newCall(o.value).retry((count, throwable) -> throwable instanceof MyException || count < 10)).subscribe(...) если вам это очень нужно :) - person Dmitry Ok; 11.11.2015