2016-12-05 3 views
1

Я новичок в RxJava, но мне это нравится. И теперь у меня мало проблем. Я использую RxJava + Retrofit.Как добавить логику токенов обновления в RxJava + Retrofit?

Если у меня есть действительный маркер для пользователя, я получаю ответ для API, но если маркер является недействительным, я должен обновить маркер и попытаться сделать запрос.

Действительный маркер:

  1. Сделать reuqest
  2. Получить ответ
  3. Совершено

Недопустимый маркер:

  1. Сделать запрос
  2. Получить ответ
  3. Ifresponse_code == 403, необходимо обновить маркер
  4. Обновить маркер
  5. Здесь я хочу перейти на 1 шаг и сделать запрос к API снова
  6. Else - сделано

Как сделать это с помощью RxJava?

ответ

2

Попробуйте это имеет свои знания

service.normalRequest() 
      .flatMap(new Func1<Response, Observable<Response>>() { 
       @Override 
       public Observable<Response> call(Response response) { 
        if (response.code() == 403) { 
         return service.refreshToken(refreshRequest) 
           .flatMap(new Func1<Response, Observable<Response>>() { 
            @Override 
            public Observable<Response> call(Response response) { 
             return service.normalRequest(); 
            } 
           }); 

        } else { 
         return Observable.just(response); 
        } 

       } 
      }).subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(
       new Subscriber<Response>() { 
        @Override 
        public void onCompleted() { 

        } 

        @Override 
        public void onError(Throwable e) { 

        } 

        @Override 
        public void onNext(Response response) { 

       } 
      }); 
1

Существует специальный оператор, который может быть использован в данном случае:

public final Observable<T> retryWhen(final Func1<? super Observable<? extends Throwable>, ? extends Observable<?>> notificationHandler)

Если вы реализуете это вы увидите, какие параметры он принимает:

observable.retryWhen(new Func1<Observable<? extends Throwable>, Observable<T>>() { 
    @Override 
    public Observable<T> call(final Observable<? extends Throwable> error) { 

    } 
}); 

Вы можете видеть, что вы получаете ошибку, которая была выбрана OkHttp. Он всегда бросает HttpException, если вы звоните:

httpException.code() 

вы получите номер HTTP-код.

Поэтому реализация функции выше может выглядеть следующим образом:

observable.retryWhen(new Func1<Observable<? extends Throwable>, Observable<T>>() { 
     @Override 
     public Observable<T> call(final Observable<? extends Throwable> error) { 
      return error.flatMap(doRelogging()); 
     } 
    }); 

Я сделал небольшую библиотеку, которая делает то, что вы ожидаете:

RetrofitRxErrorHandler

Вы можете попробовать его или просто ознакомьтесь с источниками для более продвинутых стратегий повторного использования в отношении получения ошибок API.

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