Android (Java) HttpURLConnection Silent Retry bei 'Read' Timeout

Also ich benutzeGoogle Volley für HTTP-Anfrage, die grundsätzlich @ verwendJava 'sHttpURLConnection.

Nach meinen Tests ist das Problem ist das:
Wenn das 'Lesen'-Timeout auf demHttpURLConnection erreicht, wird ein stiller Wiederholungsversuch ausgeführt, bevor die Verbindung geschlossen und die entsprechende Ausnahme ausgelöst wird SocketTimeoutException).

Hinwei Das
- Ich habe diesen Fehler bei der Verwendung von @ bemerHTTP POST Anfrage
- Das Zeitlimit für "Lesen" unterscheidet sich vom Zeitlimit für "Verbinden".
- Wenn das Zeitlimit für "Lesen" (durch Aufrufen von @ festgelegconnection.setReadTimeout(int)) ist NICHT gesetzt (0) oder auf einen größeren Wert als @ gesetconnection.setConnectTimeout(int), dieser Fehler tritt nicht auf.
- Dieses Problem wurde besprochen,Hie zum Beispiel, aber ich habe keine zufriedenstellende Lösung gefunden.
- Ein etwas verwandtes Problem kann gefunden werdenHie, aber ich bin nicht sicher, ob es relevant ist (oder?)

Mehr Hintergrund
Meine App wird zum Bezahlen von Geld verwendet, daher ist es von entscheidender Bedeutung, eine Anfrage nicht erneut zu versuchen (ja, ich weiß, dass sie vom Server verarbeitet werden kann, ich möchte, dass mein Client trotzdem "korrekt" ist).

Wenn das Zeitlimit für "Lesen" festgelegt ist, wartet der Server vor der Beantwortung auf die Antwort "Zeitlimitüberschreitung", falls die Serververbindung hergestellt wurde, wartet er jedoch / schläft / verzögert sie - und löst damit die Ausnahme "Lesen" und nicht die Ausnahme "Verbinden" aus ) wird eine weitere (stille) Anforderung gesendet, kurz bevor diese Ausnahme ausgelöst wird, was zu zwei ähnlichen Anforderungen führt, was nicht akzeptabel ist.

Welche Art von Lösung suche ich?
Na ja, eine, die dieses Problem / den Bug gut löst, genau wie das Update, das @ erklärHie (aber ich wieder, ich denke, es ist in diesem Fall irrelevant).
Auch würde ich den ursprünglichen Fluss beibehalten wollen, was bedeutet, dass die Verbindung nicht geschlossen werden muss oder so.

Was ich jetzt tun werde, ist das 'Lese'-Timeout auf das Doppelte des' Verbindungs'-Timeouts einzustellen (sie beginnen gleichzeitig zu zählen), um sicherzustellen, dass die 'Verbindungs'-Ausnahme zuerst ausgelöst wird. Ich werde auch versuchen, dieses Problem auf der Serverseite zu überwinden. Das Problem ist, dass dieses 'Lese'-Timeout nicht ohne Grund vorhanden ist und meine aktuelle Implementierung es praktisch einfach ignoriert und nur' Verbindungs'-Timeouts verarbeitet.

BEARBEITE DasVolley BibliothekRetryPolicy hat keinen Einfluss auf dieses Problem, da dies ein unbeaufsichtigter Wiederholungsversuch ist. Ich schaute so tief wie möglich in die Bibliothek. Protokolle / Haltepunkte überall, abgebrochene Anrufe, um es erneut zu versuchen. Das ist, wie ich weiß, 99,99% einHttpURLConnection Problem

Antworten auf die Frage(8)

Ihre Antwort auf die Frage