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());
Hice una pregunta similar aquí:
Android Volley realiza 2 solicitudes al servidor cuando la política de reintento se establece en 0
Pude resolver este problema estableciendo la propiedad keep-alive en false dentro de Android, por ejemplo:
System.setProperty("http.keepAlive", "false")
Agregué esta línea de código dentro de la clase donde importo requestqueue y realizo las solicitudes.
Además, verifica si tu servidor tiene el encabezado keep-alive.
Esta post ayudó a llegar a la solución.
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;
}
Logré solucionar esto configurando HttpURLConnection de esta manera:
connection.setChunkedStreamingMode(0);
Comencé una discusión sobre esto en la lista de correo electrónico de Volley ( https://groups.google.com/forum/#!topic/volley-users/8PE9dBbD6iA ).
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í.