Поэтому я использую Google Volley
для HTTP-запроса, который в основном использует HttpURLConnection
Java
.
Согласно моим тестам, проблема заключается в следующем:
Когда время ожидания "чтения" на HttpURLConnection
достигает, выполняется повторная попытка без вывода сообщений до закрытия соединения и создания соответствующего исключения (SocketTimeoutException
).
Обратите внимание на следующее:
– Я заметил эту ошибку при использовании запроса HTTP POST
.
– Тайм-аут «чтения» отличается от тайм-аута «подключения».
– Если тайм-аут «чтения» ( задано вызовом connection.setReadTimeout(int)
) НЕ установлено (0) или установлено большее значение, чем connection.setConnectTimeout(int)
, эта ошибка не возникает.
- Эта проблема обсуждалась, здесь, например, но я не нашел удовлетворительного решения.
— Несколько связанную проблему можно найти здесь, но я не уверен, что это актуально (не так ли?)
Дополнительная информация
Мое приложение используется для оплаты денег, поэтому крайне важно не повторять запрос (да, я знаю, что сервер может обработать его, но я все равно хочу, чтобы мой клиент был "правильным" ).
Когда установлен тайм-аут «чтения», в случае, если соединение с сервером установлено, но сервер ждет/спит/задерживает ответ на это время «тайм-аута» перед ответом (таким образом, возникает исключение «чтение», а не исключение «подключение») , другой (тихий) запрос отправляется непосредственно перед тем, как возникнет это исключение, что приводит к 2 похожим запросам, что недопустимо.
Какое решение я ищу?
Хорошо, решение, которое хорошо решит эту проблему/ошибку, точно так же, как описано в исправлении здесь (но я опять же думаю, что в данном случае это не имеет значения).
Кроме того, я хотел бы сохранить исходный поток как есть, то есть не принудительно закрывать соединение или что-то в этом роде.
Что я собираюсь сделать сейчас, так это установить время ожидания «чтения» в два раза больше времени ожидания «соединения» (они начинают отсчет в одно и то же время), чтобы убедиться, что сначала возникает исключение «соединение». Я также попытаюсь преодолеть эту проблему на стороне сервера. Проблема в том, что этот тайм-аут «чтения» существует по какой-то причине, и моя текущая реализация практически просто игнорирует его и обрабатывает только тайм-ауты «соединения».
EDIT RetryPolicy
библиотеки Volley
не влияет на эту проблему, так как это повторная попытка без вывода сообщений. Я заглянул как можно глубже в библиотеку. Логи/брейкпойнты везде, отменил вызовы на повтор. Вот откуда я знаю, что это на 99,99% проблема HttpURLConnection
.