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