Search code examples
androidretrofitokhttp

How to retry HTTP requests with OkHttp/Retrofit?


I am using Retrofit/OkHttp (1.6) in my Android project.

I don't find any request retry mechanism built-in to either of them. On searching more, I read OkHttp seems to have silent-retries. I don't see that happening on any of my connections (HTTP or HTTPS). How to configure retries with okclient ?

For now, I am catching exceptions and retrying maintaining a counter variable.


Solution

  • For Retrofit 2.x;

    You can use Call.clone() method to clone request and execute it.

    For Retrofit 1.x;

    You can use Interceptors. Create a custom interceptor

        OkHttpClient client = new OkHttpClient();
        client.setConnectTimeout(CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
        client.setReadTimeout(READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
        client.interceptors().add(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
    
                // try the request
                Response response = chain.proceed(request);
    
                int tryCount = 0;
                while (!response.isSuccessful() && tryCount < 3) {
    
                    Log.d("intercept", "Request is not successful - " + tryCount);
    
                    tryCount++;
    
                    // retry the request
                    response.close()
                    response = chain.proceed(request);
                }
    
                // otherwise just pass the original response on
                return response;
            }
        });
    

    And use it while creating RestAdapter.

    new RestAdapter.Builder()
            .setEndpoint(API_URL)
            .setRequestInterceptor(requestInterceptor)
            .setClient(new OkClient(client))
            .build()
            .create(Adapter.class);