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


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

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

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

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

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

9 165

9 ответов:

посмотреть 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));

для обработки Android Volley Timeout вам нужно использовать RetryPolicy

RetryPolicy

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

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

Он имеет дело с этими тремя параметрами

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

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

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

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

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

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

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

Итак, в конце Повторить Попытку 2 если все еще тайм-аут сокета происходит залп бросит TimeoutError в обработчике ответов на ошибки пользовательского интерфейса.

//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));

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

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

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

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

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

/**
 * @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);
}
req.setRetryPolicy(new DefaultRetryPolicy(
    MY_SOCKET_TIMEOUT_MS, 
    DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

вы можете установить MY_SOCKET_TIMEOUT_MS как 100. Все, что вы хотите установить в миллисекундах. DEFAULT_MAX_RETRIES может быть 0 по умолчанию-1.

int MY_SOCKET_TIMEOUT_MS=500;

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

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

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

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

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

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

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

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

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

Я закончил тем, что добавил метод setCurrentTimeout(int timeout) до RetryPolicy и это реализация в DefaultRetryPolicy.

затем я добавил setCurrentTimeout(int timeout) в классе запроса и вызвал его .

это, кажется, делает свою работу.

извините за мою лень кстати и ура для open source.