2017-05-05 8 views
3

RxJava 2 어댑터와 함께 Retrofit 2를 사용하고 있습니다. 서버가 401 권한이 반환 할 때마다Retrofit 2 + RxJava retryWhen

, 나는 토큰을 새로 고치고 요청을 재 시도 : refreshToken 간단한 개조 호출입니다

apiCall.retryWhen(es -> es 
    .flatMap(e -> { 
     if (isUnauthorizedException(e)) { 
      return refreshToken(); 
     } 

     return Flowable.<User>error(e); 
    })); 

: 이제

public Flowable<User> refreshToken() { 
    return retrofitService.login(userCredentials); 
} 

, 내가 제한 싶습니다을 그러한 새로 고침이 가능한 횟수. 그러나 take(1)을 단순히 추가하면 retryWhen가 onNext 직후 onCompleted를 수신하고 다시 시도하기 전에 요청을 취소하기 때문에 작동하지 않습니다.

당연히 나는 원하는 효과를 얻기 위해 take(2)을 할 수 있지만 해킹처럼 보입니다.

Rx 연산자를 사용하여 가장 좋은 방법은 무엇입니까? 또한 "어설 션"논리를 가진 연산자가 있습니까 (플랫 맵에서 if 없애기 위해)?

나는 또한 OkHttp 인터셉터를 사용하여 같은 것을 얻을 수 있다는 것을 알고 있지만 Retrofit-RxJava 솔루션에 관심이 있습니다.

+0

''다시 시도 하시겠습니까? ' - 유동 플로 블 refreshToken() { return retrofitService.login (userCredentials) .retry (3); }''- 오류가 발생하기 전에 최대 3 회 재 시도합니다. – Fred

답변

1


의 좋은 예가 있습니다. 기다리는 시간 (초)이 증가 할 때마다 3 번 재 시도합니다.

ObservableSource.create((Observer<? super String> s) -> { 

    System.out.println("subscribing"); 
    s.onError(new RuntimeException("always fails")); 

}).retryWhen(attempts -> { 

    return attempts.zipWith(ObservableSource.range(1, 3), 
    (n, i) -> i).flatMap(i -> { 

    System.out.println("delay retry by " + i + " second(s)"); 
    return ObservableSource.timer(i, TimeUnit.SECONDS); 

    }); 
}).blockingForEach(System.out::println); 

출력된다 :

  • (3 초씩 2초 발
  • 가입 지연 트라이를 1 초 (S)
  • 가입 지연 재시 의해
  • 지연 재시 구독 s)
  • 구독 중

요구 사항에 따라이 예제를 수정할 수 있습니다.

관련 문제