2017-02-22 39 views
0

Имейте реализацию конечных точек API через Retrofit, которая возвращает Observable.Как принять последний элемент или запросить еще раз, если ошибка (RxJava + Retrofit)

Observable<Post> postObservable = sampleApi.getPost(1); 

нужно что-то подобный cache оператора ого, но без кэширования ошибок.

Таким образом, если первый абонент postObservable получает сообщение об ошибке, второй абонент после этого может получить объект Post в onNext потребителя, после postObservable запросить API еще раз. Итак, если первый абонент postObservable получает объект Post в onNext потребителя, второй абонент после этого получает тот же объект Post в onNext потребителя немедленно.

ответ

0

Найдено решение, но не может убедиться, что это правильно, а не так элегантно:

postObservable = Observable.wrap(
      new ObservableSource<Post>() { 
       private Post lastResult; 

       @Override 
       public void subscribe(Observer<? super Post> observer) { 
        if (lastResult == null) { 
         sampleApi.getPost(1) 
           .doOnNext(post -> lastResult = post) 
           .subscribe(observer); 
        } else { 
         Observable.just(lastResult) 
           .subscribe(observer); 
        } 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread());