Как повторить Запросы HTTP с OkHttp/Retrofit?

Я использую Retrofit/OkHttp (1.6) в моем проекте Android.

Я не нахожу механизм повторной попытки запроса встроенным ни одному из них. При поиске больше, я читал, OkHttp, кажется, имеет тихие повторения. Я не вижу что, происходя на любом из моих соединений (HTTP или HTTPS). Как настроить повторения с okclient?

На данный момент я ловлю исключения и повторяю поддержание переменной счетчика.

59
задан 4 July 2014 в 00:23

2 ответа

Решение, которое работало на меня на OkHttp 3.9.1 (рассматривающий другие ответы для этого вопроса):

@NonNull
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
    Request  request      = chain.request();
    int      retriesCount = 0;
    Response response     = null;

    do {
        try {
            response = chain.proceed(request);

        // Retry if no internet connection.
        } catch (ConnectException e) {
            Log.e(TAG, "intercept: ", e);
            retriesCount++;

            try {
                Thread.sleep(RETRY_TIME);

            } catch (InterruptedException e1) {
                Log.e(TAG, "intercept: ", e1);
            }
        }

    } while (response == null && retriesCount < MAX_RETRIES);

    // If there was no internet connection, then response will be null.
    // Need to initialize response anyway to avoid NullPointerException.
    if (response == null) {
        response = chain.proceed(newRequest);
    }

    return response;
}
0
ответ дан 1 November 2019 в 11:56

Рабочее решение для напоминания.

public int callAPI() {
    return 1; //some method to be retried
}

public int retrylogic()  throws InterruptedException, IOException{
    int retry = 0;
    int status = -1;
    boolean delay = false;
    do {
        if (delay) {
            Thread.sleep(2000);
        }

        try {
            status = callAPI();
        }
        catch (Exception e) {
            System.out.println("Error occured");
            status = -1;
        }
        finally {
            switch (status) {
            case 200:
                System.out.println(" **OK**");
                return status; 
            default:
                System.out.println(" **unknown response code**.");
                break;
            }
            retry++;
            System.out.println("Failed retry " + retry + "/" + 3);
            delay = true;

        } 
    }while (retry < 3);

    System.out.println("Aborting download of dataset.");
    return status;
}
0
ответ дан 1 November 2019 в 11:56

Другие вопросы по тегам:

Похожие вопросы: