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?
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));
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));
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.
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);
}
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.
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));
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())
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
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.
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