2015-07-06 2 views
4

То, что я хочу достичь, это:В RxJava, как повторить/резюме по ошибке, вместо завершения наблюдаемой

  • монитор предпочтения определенного изменения
  • при обнаружении изменения, начать новую сеть вызовы с использованием нового значения
  • преобразования результата
  • отображение результата в интерфейсе

Я знаю, когда изменение происходит, теперь я полагаю, я необходимо вызвать onNext в теме. Затем это должно инициировать цепочку Rx, и в конце я могу обновить интерфейс.

mViewPeriodSubject = PublishSubject.create(); 

mAdapterObservable = 
    mViewPeriodSubject 
     .flatMap(period -> MyRetrofitAPI.getService().fetchData(period)) // this might fail 
     .flatMap(Observable::from) 
     .map(MyItem::modifyItem) 
     .toList() 
     .map(obj -> new MyAdapter(obj)); 


mViewPeriodSubject.onNext("week"); // this one starts the chain 
mViewPeriodSubject.onNext("year"); // this one does not 

Но в случае сетевого вызова неисправного, наблюдаемые ошибки и вызывающей onNext() не приводит к другой сети вызова.

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

+0

читать [это] (https://github.com/ReactiveX/RxJava/wiki/Error-Handling), я предполагаю раствор 3 или 4 применяется (проглотить ошибку и перезапустить), используя один из операторы обработки ошибок (https://github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators) могут помочь, а именно [повторить попытку или повторить попытку] (http://reactivex.io/documentation/operators/retry .html). – Dorus

+0

Есть также несколько полных примеров для 'retryWhen' здесь, на SO. –

+0

@ david.mihola Нравится этот https://stackoverflow.com/questions/18978523/write-an-rx-retryafter-extension-method (неправильный язык, это C#). – Dorus

ответ

6

Вам не нужно иметь дело с ошибкой с вашим mViewPeriodSubject, но вместо этого иметь дело с ошибками в вашем модифицированном наблюдении. Этот модифицированный Observable не возобновится, но, по крайней мере, это не повлияет на ваше «основное» наблюдение.

mAdapterObservable = 
mViewPeriodSubject 
    .flatMap(period -> MyRetrofitAPI.getService().fetchData(period).onErrorResumeNext(e -> Observable.empty()) // this might fail 
    .flatMap(Observable::from) 
    .map(MyItem::modifyItem) 
    .toList() 
    .map(obj -> new MyAdapter(obj)); 
+1

Это решение работает для меня. И это научило меня немного больше о RxJva. Ура! – xorgate