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 запроса.
Нужна помощь здесь.
редактировать
Мне удалось решить мою проблему, установив для свойства keep-alive значение false внутри Android. например:
System.setProperty("http.keepAlive", "false");
Я добавил эту строку кода в класс, куда я импортирую очередь запросов и делаю запросы.
Также проверьте, есть ли на вашем сервере заголовок keep-alive.
Этот пост помог найти решение.
3 ответа
Класс hasAttemptRemaining () класса DefaultRetryPolicy.class выглядит следующим образом:
protected boolean hasAttemptRemaining() {
return this.mCurrentRetryCount <= this.mMaxNumRetries;
}
Из того, что я вижу, установка maxNumRetries в 0 все равно сделает это возвращение true, если он еще не сделал повторную попытку.
Я исправил это с
request.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0);
Я использую это, чтобы установить политику повторения:
myRequest.setRetryPolicy(new DefaultRetryPolicy(0,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Просто установите время ожидания 20 секунд или больше, как вы хотите, и повторите попытку до 0
req.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));