volley studio newrequestqueue example android android-volley

studio - Doble publicación de Android Volley cuando tiene una solicitud lenta



volley android studio 2018 (16)

Agregue los siguientes valores a su objeto Request:

request.setRetryPolicy(new DefaultRetryPolicy( DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Aquí: request es su objeto de JsonObjectRequest. Cambie el valor del multiplicador según el VALOR DE TIEMPO PREDETERMINADO en la clase DefaultRetryPolicy en Volley.

También puede establecer el primer argumento en 0, como a continuación:

request.setRetryPolicy(new DefaultRetryPolicy( 0, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Tengo un problema con la solicitud POST de Volley en una red lenta. Cada vez que veo BasicNetwork.logSlowRequests en mi LogCat, mi solicitud POST se ejecuta dos veces o más y resulta en varias (2 o más) publicaciones para 1 solicitud. Ya configuré la política de reintento a 0, pero no ayuda.

Este es mi LogCat

03-16 01: 31: 35.674: D / Volley (5984): [19807] BasicNetwork.logSlowRequests: respuesta HTTP para request = <[] http://[myserver]/api/places 0xfa7d0c33 NORMAL 1> [lifetime = 3824 ], [size = 313], [rc = 200], [retryCount = 0] 03-16 01: 31: 35.704: D / Volley (5984): [1] Request.finish: 3853 ms: [] http://[myserver]/api/places 0xfa7d0c33 NORMAL 1

Este es mi código

JSONObject body = new JSONObject(); try { body.put(PROTO_BODY_AUTHORIZATION, Sessions.getActiveSession().getToken()); } catch (JSONException e) { e.printStackTrace(); } JsonObjectRequest request = new JsonObjectRequest( Request.Method.POST, context.getResources().getString(R.string.server_address) + "/places", body, callback, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(context, error.getMessage(), Toast.LENGTH_LONG).show(); } } ); request.setRetryPolicy( new DefaultRetryPolicy( DefaultRetryPolicy.DEFAULT_TIMEOUT_MS, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); getRequestQueue().add(request);

Por favor ayuda, estoy buscando desesperadamente una solución para este problema.


Debe establecer RetryPolicy a 0 reintentos y asegurarse de que el tiempo de espera sea mayor que el tiempo de espera del servidor.

setRetryPolicy(new DefaultRetryPolicy("bigger than server timeout", 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));


Encontré la solución para el error de publicación múltiple.

Cambiar la RetryPolicy. Establecí el valor de tiempo de espera en 50000ms, funcionó bien así:

request.setRetryPolicy( new DefaultRetryPolicy( 500000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT ) );


Encontré la solución para la publicación doble, simplemente establecí el tiempo de espera en 0.


Esto funciona para mí

public class MyRetryPolicyWithoutRetry implements RetryPolicy { @override public int getCurrentTimeout() { return CONNECTION_TIME_OUT; /200000/ } @Override public int getCurrentRetryCount() { return 0; } @Override public void retry(VolleyError error) throws VolleyError { throw(error); } }

Usar:

request.setRetryPolicy(new MyRetryPolicyWithoutRetry());



Intenté muchas cosas, pero al final nada ayudó. Finalmente, descubrí la siguiente combinación de cambios:

sr.setRetryPolicy(new DefaultRetryPolicy(0,-1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Y en su conexión hurl en la clase de aplicación, agregue esto:

httpsURLConnection.setChunkedStreamingMode(0);

Esto funcionó sin problemas para evitar que Volley golpeara solicitudes múltiples en el servidor.


La única forma en que recibí las solicitudes dobles para detenerme fue establecer los intentos de reintento de política en -1

request.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0));

Creo que esto se debe a que la lógica de DefaultRetryPolicy para intentos restantes devuelve verdadero si retryCount es 0 y Max retries también es 0 en el método hasAttemptRemaining ():

protected boolean hasAttemptRemaining() { return this.mCurrentRetryCount <= this.mMaxNumRetries; }



Puedes usar esto para resolver el problema.

StringRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));


Puedo resolver este problema de dos maneras.

Primero se cambia la RetryPolicy . Simplemente configure el valor de tiempo de espera en el doble del tiempo de espera predeterminado. Funcionó bien. También puedes probar otros valores.

request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Otra forma es establecer connection.setChunkedStreamingMode(0); en el método HurlStack clase HurlStack .

Estoy creando mi RequestQueue como este requestQueue = Volley.newRequestQueue(context, new HurlStack());

Espero eso ayude :)


Solo establecer el Tiempo de espera en RetryPolicy en 0 es muy poco. Después de verificar la fuente, debe establecer realmente el número máximo de reintentos <0, ya que está comprobando la actual <= máxima ...

Solucioné la publicación doble con la configuración de la política a la siguiente

new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

¡Espero eso ayude!


la corrección de la android date corrige mi problema desafortunadamente para fines de prueba. He cambiado mi fecha de Android y he recibido un error de seguridad de SSL.


por favor aumente la hora setRetryPolicy.

request.setRetryPolicy(new DefaultRetryPolicy( 30000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); Volley.newRequestQueue(this).add(equest);


solo maxNumRetries = 0 no funciona. set TIMEOUT_MS 20000 .

request.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));


request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Esto funcionó para mí.