본문 바로가기

나의 플랫폼/안드로이드

[Retrofit2] Request Retry

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Request 해서 Fail이 났을 경우, Retry를 셋팅하는 소스를 공유 하고자 한다.



package app.goplus.in.v2.network;

import android.util.Log;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
 * Created by pallavahooja on 16/05/16.
 */

public abstract class RetryableCallback<T> implements Callback<T> {

    private int totalRetries = 3;
    private static final String TAG = RetryableCallback.class.getSimpleName();
    private final Call<T> call;
    private int retryCount = 0;

    public RetryableCallback(Call<T> call, int totalRetries) {
        this.call = call;
        this.totalRetries = totalRetries;
    }

    @Override
    public void onResponse(Call<T> call, Response<T> response) {
        if (!APIHelper.isCallSuccess(response))
            if (retryCount++ < totalRetries) {
                Log.v(TAG, "Retrying API Call -  (" + retryCount + " / " + totalRetries + ")");
                retry();
            } else
                onFinalResponse(call, response);
        else
            onFinalResponse(call,response);
    }

    @Override
    public void onFailure(Call<T> call, Throwable t) {
        Log.e(TAG, t.getMessage());
        if (retryCount++ < totalRetries) {
            Log.v(TAG, "Retrying API Call -  (" + retryCount + " / " + totalRetries + ")");
            retry();
        } else
            onFinalFailure(call, t);
    }

    public void onFinalResponse(Call<T> call, Response<T> response) {

    }

    public void onFinalFailure(Call<T> call, Throwable t) {
    }

    private void retry() {
        call.clone().enqueue(this);
    }
}

출처 : https://medium.com/shuttl/easily-retrying-network-requests-on-android-with-retrofit-2-ee4b4b379eb7#.2h6qb6q4z


소스를 보시면 아시겠지만, 정말 간단하다.


우선 retry 함수를 보시면 단 한줄로 retry가 된다


call.clone().enqueue(this);


이건 Retrofit2 버전에만 가능하다.

Retrofit 버전에서는 inteceptor를 이용하는 방법이 있다. 아래 URL을 참조 하면 좋을 듯 하다.

http://stackoverflow.com/a/31733634



retry 카운트는 Callback을 커스터마이징 해서 진행 한다.

소스를 보시면 금방 이해 하시겠지만, retryCount 가 retry를 한 횟수를 세고,

totalRetries가 횟수를 제한 하는 역할을 한다.


여기서 retryCount는 왜 초기화를 하지 않지?? 라는 의문이 혹시 드실 수도 있다.

그 이유는 아마 retrofit2로 코딩을 하시면 아시겠지만,

한 API를 호출 할 때 Callback을 그때마다 새로 만들기 때문에

retryCount를 초기화 할 필요가 없다.


참고 하세요.