У меня проблема с запросом 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));
работал на меня.