Android Volley двойной пост, когда медленный запрос

У меня проблема с запросом POST Volley в медленной сети. Каждый раз, когда я вижу BasicNetwork.logSlowRequests в моем LogCat, мой запрос POST выполняется дважды или несколько результирующих множественных (2 или более) сообщений для 1 запроса. Я уже установил политику повтора на 0, но это не поможет.

Это мой LogCat

03-16 01: 31: 35.674: D / Volley (5984): [19807] BasicNetwork.logSlowRequests: HTTP-ответ для запроса = <[] 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 НОРМАЛЬНЫЙ 1

Это мой код

  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); 

Помогите, я отчаянно нахожу решение этой проблемы.

Добавьте следующие значения в объект Request

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

Здесь: запрос является вашим объектом JsonObjectRequest и изменяет значение мультипликатора в соответствии с значением DEFAULT TIME-OUT VALUE в классе DefaultRetryPolicy в залпе

Вы также можете установить первый аргумент равным 0, как показано ниже

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

Я нашел решение для двойной почты, я просто установил таймаут в 0.

Просто установить Timeout в RetryPolicy на 0 слишком мало. После проверки источника вы должны установить максимальное количество попыток <0, поскольку он проверяет текущий <= max …

Я установил двойную публикацию с установкой политики на следующие

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

Надеюсь, поможет!

Я могу решить эту проблему двумя способами.

Сначала изменяется RetryPolicy . Просто установите значение тайм-аута в два раза по умолчанию. Отлично. Вы также можете попробовать другие значения.

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

Другой способ – установить connection.setChunkedStreamingMode(0); openConnection методе HurlStack класса HurlStack .

Я создаю свой RequestQueue как this requestQueue = Volley.newRequestQueue(context, new HurlStack());

Надеюсь, поможет 🙂

Я нашел решение для многопользовательской ошибки.

Измените RetryPolicy. Я установил значение таймаута в 50000 мс, отлично работал. Вот так:

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

Увеличьте время setRetryPolicy.

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

Я задал аналогичный вопрос:

Android Volley делает 2 запроса на сервер, когда для политики повторных попыток установлено значение 0

Мне удалось решить эту проблему, установив для свойства keep-alive значение false внутри Android, например:

 System.setProperty("http.keepAlive", "false") 

Я добавил эту строку кода внутри класса, где я импортирую requestqueue и делаю запросы.

Кроме того, проверьте, есть ли у сервера заголовок keep-alive.

Этот пост помог решить проблему.

Это работает для меня.

 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); } } 

Использовать:

 request.setRetryPolicy(new MyRetryPolicyWithoutRetry()); 

Вы должны установить RetryPolicy на 0 повторений и убедиться, что тайм-аут больше, чем таймаут сервера.

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

Мне удалось это исправить, настроив HttpURLConnection следующим образом:

 connection.setChunkedStreamingMode(0); 

Я начал дискуссию об этом в списке электронной почты Volley ( https://groups.google.com/forum/#!topic/volley-users/8PE9dBbD6iA ).

Просто maxNumRetries = 0 нет работы. 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)); 

Это сработало для меня.

Вы можете использовать это, чтобы решить проблему.

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

Единственный способ, которым я получил двойные запросы, чтобы остановить, – установить повторные попытки повторной политики на -1

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

Я думаю, это связано с тем, что логика DefaultRetryPolicy для оставшихся попыток возвращает true, если retryCount равен 0, а Max retries также равно 0 в методе hasAttemptRemaining ():

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