Cambiar la duración del tiempo de espera de volea


Utilizo el nuevo framework Volley para Android para hacer una solicitud a mi servidor. Pero se agota el tiempo antes de obtener la respuesta, aunque sí responde.

He intentado añadir este código:

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

En HttpClientStack del framework Volley a un entero diferente (50000), pero todavía se agota antes de 50 segundos.

¿Hay alguna manera de cambiar el tiempo de espera a un valor largo?

Author: Andrew T., 2013-06-13

9 answers

Ver Request.setRetryPolicy() y el constructor para DefaultRetryPolicy, por ejemplo,

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));
 323
Author: larham1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-05 06:15:45

Para manejar Android Volley Tiempo de espera que necesita para utilizar RetryPolicy

Política de retracción

  • Volley proporciona una manera fácil de implementar su RetryPolicy para sus solicitudes.
  • Volley establece por defecto Socket & ConnectionTimeout a 5 segundos para todas las peticiones.

RetryPolicy es una interfaz en la que necesita implementar su lógica de cómo desea reintentar una solicitud en particular cuando se produce un tiempo de espera.

Trata de estos tres parámetros

  • Timeout - Especifica el tiempo de espera del Socket en milis por cada intento de reintento.
  • Número de Reintentos - Número de veces que se intenta reintentar.
  • Back Off Multiplier - Un multiplicador que se utiliza para determinar el tiempo exponencial establecido en socket para cada intento de reintento.

Para ex. Si se crea RetryPolicy con estos valores

Tiempo de espera - 3000 ms, Número de Intentos de Reintento - 2, Multiplicador de Retroceso - 2.0

Intento de Reintento 1:

  • tiempo = tiempo + (tiempo * Multiplicador de retroceso);
  • tiempo = 3000 + 6000 = 9000ms
  • Tiempo de espera del socket = tiempo;
  • Solicitud enviada con un tiempo de espera de Socket de 9 Segundos

Intento de Reintento 2:

  • tiempo = tiempo + (tiempo * Multiplicador de retroceso);
  • tiempo = 9000 + 18000 = 27000ms
  • Tiempo de espera del socket = tiempo;
  • Solicitud enviada con un tiempo de espera de Socket de 27 Segundos

Así que al final de Vuelva a intentar Intentar 2 si todavía ocurre el tiempo de espera del Socket, Volley lanzará un TimeoutError en su controlador de respuesta de error de interfaz de usuario.

//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));
 205
Author: Yakiv Mospan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-28 18:26:52

Solo para contribuir con mi enfoque. Como ya se ha contestado, RetryPolicy es el camino a seguir. Pero si necesita una política diferente a la predeterminada para todas sus solicitudes, puede establecerla en una clase de solicitud base, por lo que no necesita establecer la política para todas las instancias de sus solicitudes.

Algo como esto:

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

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

En mi caso, tengo una GsonRequest que se extiende desde esta BaseRequest, por lo que no corro el riesgo de olvidar establecer la política para una solicitud específica y aún puede anularlo si alguna petición específica lo requiere.

 22
Author: Androiderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-15 22:09:19
/**
 * @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);
}
 9
Author: chavantr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-05 09:48:37
req.setRetryPolicy(new DefaultRetryPolicy(
    MY_SOCKET_TIMEOUT_MS, 
    DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Puede establecer MY_SOCKET_TIMEOUT_MS como 100. Lo que quieras establecer es en milisegundos. DEFAULT_MAX_RETRIES puede ser 0 el valor predeterminado es 1.

 5
Author: Manasvi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-07 11:41:00
int MY_SOCKET_TIMEOUT_MS=500;

 stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                MY_SOCKET_TIMEOUT_MS,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
 3
Author: Avinash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-14 09:51:55

Solución alternativa si todas las soluciones anteriores no funcionan para usted

Por defecto, Volley establece el tiempo de espera igual para setConnectionTimeout() y setReadTimeout() con el valor de RetryPolicy. En mi caso, Volley lanza la excepción de tiempo de espera para un fragmento de datos grande ver:

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

Mi solución es crear una clase que extienda HttpStack con mi propia política setReadTimeout(). Luego úsalo cuando crea RequestQueue de la siguiente manera:

Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())
 2
Author: Bao Le,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-07 10:15:17

Otra forma de hacerlo es en JsonObjectRequest personalizado por:

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

Fuente: Android Volley Ejemplo

 1
Author: KnowIT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-06 07:19:55

Terminé agregando un método setCurrentTimeout(int timeout) al RetryPolicy y su implementación en DefaultRetryPolicy.

Luego agregué un setCurrentTimeout(int timeout) en la clase Request y lo llamé .

Esto parece hacer el trabajo.

Perdón por mi pereza por cierto y hurra por el código abierto.

 1
Author: Cissmayazz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-07 08:44:59