2015-01-14 4 views
6

1-й, я попыталсяКак сохранить подписчика после OnError (RxJava)

// used retrofit 
public interface ApiService { 
    @GET(/get_some_data) 
    Observable<SomeData> getSomeData(); 
} 



// clickStream created by onClick event 
// No.1 
clickStream 
    .flatMap(e -> apiService.getSomeData()) 
    .subscribe(
     success -> Log.d("tag", "success"), 
     error -> Log.d("tag", "error"), 
     () -> Log.d("tag", "complete")) 

это хорошо, если getSomeData() успех. Я могу получить некоторые данные каждый клик.

но если произошла ошибка, отписаться. (так щелчок не работает после ошибки)


второй, я попытался ниже. (С onErrorResumeNext), но отписался.

(не называли OnError, но называется OnComplete. Так отписался)

// No.2 
clickStream 
    .flatMap(e -> apiService.getSomeData()) 
    .onErrorResumeNext(throwable -> Observable.empty()) // add this line 
    .subscribe(
     success -> Log.d("tag", "success"), 
     error -> Log.d("tag", "error"), 
     () -> Log.d("tag", "complete")) 

третий, я попытался ниже. (С повторной попытки)

// No.3 
clickStream 
    .flatMap(e -> apiService.getSomeData()) 
    .retry(5)           // add this line 
    .subscribe(
     success -> Log.d("tag", "success"), 
     error -> Log.d("tag", "error"), 
     () -> Log.d("tag", "complete")) 

это лучше, чем нет 0,1. но без записи.


Я хочу сделать кнопку обновления, которая работает после ошибки.

Я хочу знать

  1. Могу ли я сохранить или повторно подписаться абонента?
  2. Правильно ли это в Rxjava?

извините за плохой английский.

ответ

8

Ваш номер телефона. 2 был совсем близко - попробуйте это:

clickStream 
.flatMap(e -> apiService.getSomeData() 
    .onErrorResumeNext(throwable -> Observable.empty())) // add this line 
.subscribe(
    success -> Log.d("tag", "success"), 
    error -> Log.d("tag", "error"), 
    () -> Log.d("tag", "complete")) 

Обратите внимание, что я только переехал одну закрывающую скобку, так что onErrorResumeNext теперь называется после каждый ошибок и является частью «внутреннего» Наблюдаемый.

+0

Это сработало! Я могу держать абонента после onError. Ключ «** внутренний ** Наблюдаемый». Спасибо! – kyanro

+0

Это не скрывает/подавляет каждую ошибку? –

+0

Да, конечно, либо вы получаете 'onError', либо можете продолжать использовать' Subscriber', но не оба. Однако вы можете исправить некоторый тип сообщения об ошибке: 'throwable -> Observable.just (new ThereWasSomeProblemWithTheApi())). «T» в «Observable » тогда должен был быть каким-то общим интерфейсом, который совместно используется «ThereWasSomeProblemWithTheApi» и вашим фактическим типом данных. –

Смежные вопросы