android - timeouterror - defaultretrypolicy volley
Cambiar la duraciĆ³n del tiempo de espera de la Volley (9)
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: Ejemplo de Android Volley
Utilizo el nuevo marco Volley para Android para hacer una solicitud a mi servidor. Pero se agota el tiempo de espera antes de obtener la respuesta, aunque sí responde.
Traté de agregar este código:
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);
en HttpClientStack
of the Volley framework a un entero diferente (50000), pero aún se agota antes de 50 segundos.
¿Hay alguna manera de cambiar el tiempo de espera a un valor largo?
Para manejar Android Volley Timeout necesita usar RetryPolicy
RetryPolicy
- Volley proporciona una manera fácil de implementar RetryPolicy para sus solicitudes.
- Volley establece Socket & ConnectionTIeout a 5 segundos para todas las solicitudes.
RetryPolicy
es una interfaz donde necesita implementar su lógica de cómo desea volver a intentar una solicitud particular cuando ocurre un tiempo de espera.
Se trata de estos tres parámetros
- Tiempo de espera: especifica el tiempo de espera del socket en milisegundos por cada intento de reintento.
- Número de reintentos: número de intentos de reintento.
- Back Off Multiplier: un multiplicador que se usa para determinar el tiempo exponencial establecido en socket para cada intento de reintento.
Por ej. Si RetryPolicy se crea con estos valores
Tiempo de espera - 3000 ms, Num of Retry Attempts - 2, Back Off Multiplier - 2.0
Reintentar intento 1:
- time = time + (time * Back Off Multiplier);
- tiempo = 3000 + 6000 = 9000ms
- Tiempo de espera del zócalo = tiempo;
- Solicitud enviada con tiempo de espera de socket de 9 Secs
Reintentar intento 2:
- time = time + (time * Back Off Multiplier);
- tiempo = 9000 + 18000 = 27000ms
- Tiempo de espera del zócalo = tiempo;
- Solicitud enviada con el tiempo de espera del socket de 27 Secs
Por lo tanto, al final del intento de reintento 2, si aún se supera el tiempo de espera del socket, Volley lanzaría un TimeoutError
en su controlador de respuesta de error de 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));
Solo para contribuir con mi enfoque. Como ya se respondió, 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 base de solicitud, 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 puedes anularla si alguna solicitud específica lo requiere.
Solución alternativa si todas las soluciones anteriores no funcionan para usted
De forma predeterminada, Volley establece el tiempo de espera igualmente para setConnectionTimeout()
y setReadTimeout()
con el valor de RetryPolicy
. En mi caso, Volley
arroja una excepción de tiempo de espera para un gran fragmento de datos.
com.android.volley.toolbox.HurlStack.openConnection().
Mi solución es crear una clase que amplíe HttpStack
con mi propia política setReadTimeout()
. A continuación, utilícelo cuando cree RequestQueue
siguiente manera:
Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())
Terminé agregando un método setCurrentTimeout(int timeout)
a 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 flojera por cierto y hurra por el código abierto.
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));
/**
* @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);
}
int MY_SOCKET_TIMEOUT_MS=500;
stringRequest.setRetryPolicy(new DefaultRetryPolicy(
MY_SOCKET_TIMEOUT_MS,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
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 sea que quiera configurar es en milisegundos. DEFAULT_MAX_RETRIES
puede ser 0 por defecto es 1.