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

Я работаю над проектом Android, который использует Volley для асинхронных запросов и обработки изображений. Как-то запрос дважды ударяет по серверу, даже когда у меня установлена ​​политика повтора на 0. Я попытался переопределить значения из объекта DefaultRetryPolicy без успеха. Вот пример кода:

Запрос:

@Override
public void gravarVendaMobile(final Usuario usuarioAutenticado, final AsyncCallback<String> callback) {
    obterParametrosDeInicializacao().done(new DoneCallback<ParametrosDeInicializacao>() {
        @Override
        public void onDone(final ParametrosDeInicializacao param) {
            requestQueue.add(setDefaultRetryPolicy(new StringRequest(
                    Method.POST,
                    urlPara(GRAVAR_VENDA_MOBILE, usuarioAutenticado.getFilial(), usuarioAutenticado.getCodigo()),
                    listener(callback),
                    //errorListener(R.string.could_not_load_produtos, callback)
                    new ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            callback.onError(new MessageCodeException(error.networkResponse.statusCode, error));
                        }
                    }
            ) {

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> headers = new HashMap<String, String>();
                    headers.put("Encoding", "UTF-8");
                    headers.put("Accept", "application/json");
                    headers.put("Content-type", "application/json; charset=UTF-8");
                    return headers;
                }


            }));
        }
    });
}

Политика повтора:

private Request<?> setDefaultRetryPolicy(Request<?> request) {
    request.setRetryPolicy(new DefaultRetryPolicy(30000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

    return request;
}

В принципе, я хочу установить тайм-аут на 30 секунд с помощью 0 попыток.

Если я увеличиваю количество повторений, он работает так, как ожидалось, но если я устанавливаю его на 0, он делает 2 запроса.

Вам нужна помощь здесь.

Edit

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

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

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

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

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

Ответ 1

Я использую это, чтобы установить политику no-repeat:

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

Ответ 2

Класс DefaultRetryPolicy.class hasAttemptRemaining() выглядит следующим образом:

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

Из того, что я вижу, установка maxNumRetries в 0 будет по-прежнему возвращать true, если она еще не выполнила повтор.

Я зафиксировал его с помощью

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

Ответ 3

Просто установите время ожидания до 20 секунд или более, как вы хотите, и повторите попытку до 0

req.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 0,
  DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));