Изменение продолжительности тайм-аута волейбола

Я использую новую инфраструктуру Volley для Android, чтобы выполнить запрос на мой сервер. Но это таймауты, прежде чем получить ответ, хотя он и отвечает.

Я попытался добавить этот код:

HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);

в HttpClientStack рамки Volley для другого целого числа (50000), но он все еще не работает до 50 секунд.

Есть ли способ изменить тайм-аут на длинное значение?

Ответ 1

См. Request.setRetryPolicy() и конструктор для DefaultRetryPolicy, например

JsonObjectRequest myRequest = new JsonObjectRequest(Method.GET,
        url, null,
        new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d(TAG, response.toString());
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d(TAG, "Error: " + error.getMessage());
            }
});

myRequest.setRetryPolicy(new DefaultRetryPolicy(
        MY_SOCKET_TIMEOUT_MS, 
        DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Ответ 2

Чтобы обрабатывать тайм-аут волейбола Android, вам нужно использовать RetryPolicy

RetryPolicy

  • Volley предоставляет простой способ реализовать RetryPolicy для ваших запросов.
  • Volley устанавливает по умолчанию Socket и ConnectionTImeout до 5 секунд для всех запросов.

RetryPolicy - это интерфейс, в котором вам нужно реализовать свою логику того, как вы хотите повторить определенный запрос, когда произойдет таймаут.

Он обрабатывает эти три параметра

  • Таймаут - задает тайм-аут сокета в миллисекундах за каждую попытку повтора.
  • Количество повторов - количество попыток повторения попыток.
  • Back Off Multiplier - множитель, который используется для определения экспоненциального времени, установленного в socket для каждой попытки повтора.

Например, Если RetryPolicy создается с этими значениями

Тайм-аут - 3000 мс, количество попыток повтора - 2, множитель Back Off - 2.0

Повторить попытку 1:

  • time = time + (time * Back Off Multiplier);
  • время = 3000 + 6000 = 9000 мс
  • Тайм-аут сокета = время;
  • Запрос отправлен с таймером Socket 9 сек.

Повторить попытку 2:

  • time = time + (time * Back Off Multiplier);
  • time = 9000 + 18000 = 27000ms
  • Тайм-аут сокета = время;
  • Запрос отправлен с таймером Socket 27 сек.

Итак, в конце Retry Attempt 2, если все же произойдет Socket Timeout, Volley выбрал бы TimeoutError в вашем обработчике ответов об ошибках UI.

//Set a retry policy in case of SocketTimeout & ConnectionTimeout Exceptions. 
//Volley does retry for you if you have specified the policy.
jsonObjRequest.setRetryPolicy(new DefaultRetryPolicy(5000, 
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Ответ 3

Просто чтобы внести свой вклад в мой подход. Как уже было сказано, RetryPolicy - это путь. Но если вам нужна политика, отличная от по умолчанию для всех ваших запросов, вы можете установить ее в базовом классе Request, поэтому вам не нужно устанавливать политику для всех экземпляров ваших запросов.

Что-то вроде этого:

public class BaseRequest<T> extends Request<T> {

    public BaseRequest(int method, String url, Response.ErrorListener listener) {
        super(method, url, listener);
        setRetryPolicy(getMyOwnDefaultRetryPolicy());
    }
}

В моем случае у меня есть GsonRequest, который простирается от этого BaseRequest, поэтому я не рискую забыть установить политику для конкретного запроса, и вы все равно можете переопределить его, если требуется определенный запрос.

Ответ 4

/**
 * @param request
 * @param <T>
 */
public <T> void addToRequestQueue(Request<T> request) {

    request.setRetryPolicy(new DefaultRetryPolicy(
            MY_SOCKET_TIMEOUT_MS,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

    getRequestQueue().add(request);
}

Ответ 5

Альтернативное решение, если все вышеперечисленные решения не работают для вас

По умолчанию Volley устанавливает тайм-аут одинаково для setConnectionTimeout() и setReadTimeout() со значением от RetryPolicy. В моем случае Volley выдает исключение тайм-аута для большого блока данных:

com.android.volley.toolbox.HurlStack.openConnection(). 

Мое решение - создать класс, который расширяет HttpStack с помощью моей собственной политики setReadTimeout(). Затем используйте его при создании RequestQueue следующим образом:

Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())

Ответ 6

В итоге я добавил метод setCurrentTimeout(int timeout) в RetryPolicy и его реализацию в DefaultRetryPolicy.

Затем я добавил setCurrentTimeout(int timeout) в класс Request и назвал его.

Это, похоже, выполняет эту работу.

Извините за мою лень, кстати и ура для открытого источника.

Ответ 7

Другой способ сделать это в пользовательском JsonObjectRequest:

@Override
public RetryPolicy getRetryPolicy() {
    // here you can write a custom retry policy and return it
    return super.getRetryPolicy();
}

Источник: Пример Android Volley