본문 바로가기
Development/Android

[android] Retrofit2 과 retryWhen 를 조합하여 어떻게 사용할까?

by Sonagiya 2021. 3. 19.
반응형

from : http://reactivex.io/documentation/operators/retry.html

 

샘플코드를 찾아보면 zipWith 나 take에 flatMap 을 조합하여 사용하는 코드가 많이 보인다.

// retrofit2 에 구성한 서비스의 타입은 Single 타입입니다.
retryWhen { error ->
    error.zipWith(
    	Flowable.range(1, 3), 
        BiFunction<Throwable, Int, Int> { _, t2 -> t2 }
    ).flatMap { i ->
        Flowable.timer(3, TimeUnit.SECONDS)
    }
}

 

 

하지만 reactivex.io 에서 소개하는 방법이 간소하고 명확하게 보인다.

 Flowable.timer(1, TimeUnit.SECONDS)
     .doOnSubscribe(s -> System.out.println("subscribing"))
     .map(v -> { throw new RuntimeException(); })
     .retryWhen(errors -> {
         AtomicInteger counter = new AtomicInteger();
         return errors
                   .takeWhile(e -> counter.getAndIncrement() != 3)
                   .flatMap(e -> {
                       System.out.println("delay retry by " + counter.get() + " second(s)");
                       return Flowable.timer(counter.get(), TimeUnit.SECONDS);
                   });
     })
     .blockingSubscribe(System.out::println, System.out::println);

(reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html)

 

error가 Flowable<Thread> 로 넘어오는데 flatmap 이나 take로 받는다니?...

코드를 아무리봐도 동작하는게 이해가 가지 않았다. 

 

다행이 소스가 공개되어 있고 디버깅을 하면 error가 FlowableProcessor 로 되어 있는것을 확인 수 있다. 아...!!!

 

 

 

 

 

 

반응형

댓글