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

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

Это мой LogCat

03-16 01: 31: 35.674: D / Volley (5984): [19807] BasicNetwork.logSlowRequests: HTTP-ответ на запрос = <[] http: // [myserver] / api / place 0xfa7d0c33 NORMAL 1> [время жизни =3824], [size=313], [rc=200], [retryCount=0] 03-16 01:31:35.704: D/Volley(5984): [1] Request.finish: 3853 мс: [] http: / / [MyServer] / API / мест 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);

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

16 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

setRetryPolicy(new DefaultRetryPolicy("bigger than server timeout",
                                      0,
                                      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 учебный класс.

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

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

Пожалуйста, увеличьте время se tPetryPolicy.

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

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

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

Это проблема с ошибкой тайм-аута. Запрос выполняется дважды, поэтому у вас есть двойное значение.

Попробуйте увеличить запрос ошибки тайм-аута с помощью этого кода:

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

Я задал подобный вопрос здесь:

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

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

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

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

Также проверьте, есть ли на вашем сервере заголовок keep-alive.

Этот пост помог найти решение.

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

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

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

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

Политика запроса Volley только один раз, чтобы избежать дублирования сообщений

Я пробовал это решение, но не работает

//...........solution 01
jsonObjectRequest.retryPolicy = DefaultRetryPolicy(
120000, 
0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)


or

//...........solution 02
jsonObjectRequest.retryPolicy = DefaultRetryPolicy(
0, 
-1,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)


MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest)

Полный исходный код: https://androidkeynotes.blogspot.com/2020/02/volley.html

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

jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(0, 
     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));

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

connection.setChunkedStreamingMode(0);

Я начал обсуждение этого в списке адресов электронной почты Volley ( https://groups.google.com/forum/).

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

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

И в вашем HURL-соединении в классе приложения добавьте это:

httpsURLConnection.setChunkedStreamingMode(0);

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

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

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

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

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

request.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Другие вопросы по тегам