Development/Android
[android] Retrofit2 과 retryWhen 를 조합하여 어떻게 사용할까?
Sonagiya
2021. 3. 19. 15:12
728x90
반응형
샘플코드를 찾아보면 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 로 되어 있는것을 확인 수 있다. 아...!!!
반응형