본문 바로가기

Android/기타

[Android] Retrofit2 재시도 로직 넣기

반응형

안드로이드에서 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/

 

 

반응형