반응형
안드로이드에서 API 콜 한 번 후 실패했을 때 자동으로 재시도하는 로직을 구현해야 할 때가 있다. 다음은 Retrofit2에서 재시도 로직을 넣는 커스텀 콜백을 구현하는 소스이다.
import retrofit2.Call;
import retrofit2.Callback;
public abstract class AutoRetryCallback<T> implements Callback<T> {
private final int mRetryLimitCount;
private int mRetryCount = 0;
public AutoRetryCallback() {
this.mRetryLimitCount = 3;
}
public AutoRetryCallback(int retryLimitCount) {
this.mRetryLimitCount = retryLimitCount;
}
@Override
public void onFailure(Call<T> call, Throwable t) {
mRetryCount++;
if (mRetryCount > mRetryLimitCount) {
onFinalFailure(call, t);
return;
}
retry(call);
}
private void retry(Call<T> call) {
call.clone().enqueue(this);
}
public abstract void onFinalFailure(Call<T> call, Throwable t);
}
기존의 Retrofit2 콜백 클래스를 위임받아서 구현을 하였는데 mRetryLimitCount는 몇 번 재시도를 할 것인지 정하는 변수이다.
과정을 요약하면 '실패 -> 재시도 횟수 확인 -> 재시도(재시도 가능) 혹은 실패(재시도 횟수 제한) ' 이렇게 된다.
retry 메소드에서 call.enqueue를 바로 하지 않고 call.clone().enqueue를 호출하는데 각각의 Call 객체는 한 번만 쓰일 수 있으며, clone() 함수를 통해 다시 사용할 수 있는 객체를 만들 수 있다고 설명이 되어있다. 다음은 해당 설명에 대한 retrofit2 홈페이지의 부분이다.
참고 : square.github.io/retrofit/
반응형
'Android > 기타' 카테고리의 다른 글
[Android] Doze 모드로 강제로 만들기 (0) | 2020.06.02 |
---|---|
[Android] View가 NullPointerException을 내는 경우 (0) | 2020.05.20 |
[Android] 인앱 결제 구현 Flow 정리 (0) | 2020.04.28 |
[Android] Retrofit2 중복 콜 문제 (0) | 2020.04.22 |
[Android] Firebase Crashlytics 연동하기 (0) | 2020.03.05 |