volley timeouterror studio error defaultretrypolicy android timeout android-volley

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.