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

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

Это мой LogCat

03-16 01:31:35.674: D/Volley(5984): [19807] BasicNetwork.logSlowRequests: HTTP response for 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

Это мой код

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

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

Ответ 1

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

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

здесь: запрос является вашим объектом JsonObjectRequest. Измените значение мультипликатора в соответствии со значением ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ ПО УМОЛЧАНИЮ в классе DefaultRetryPolicy в Volley.

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

Я создаю свой RequestQueue следующим образом requestQueue = Volley.newRequestQueue(context, new HurlStack());

Надеюсь, это поможет:)

Ответ 7

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

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

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

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

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

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

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

connection.setChunkedStreamingMode(0);

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

Ответ 11

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

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

Ответ 12

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

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

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

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

Ответ 13

просто maxNumRetries = 0 нет работы. set TIMEOUT_MS 20000.

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

Ответ 14

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

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

Ответ 15

Многое перепробовал, но в итоге ничего не помогло. Наконец, я выяснил следующую комбинацию изменений:

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

Добавьте в свой класс соединений в классе приложения следующее:

httpsURLConnection.setChunkedStreamingMode(0);

Это работало гладко, чтобы Волей не мог выполнить несколько запросов на сервере.

Ответ 16

исправление android date устраняет мою проблему, к сожалению, для целей тестирования я изменил дату своего Android и получил ssl-ошибку безопасности.

Ответ 17

Лучшее решение:

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

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