Ich verwende das neue Volley-Framework für Android, um eine Anfrage an meinen Server zu senden. Es tritt jedoch eine Zeitüberschreitung auf, bevor die Antwort angezeigt wird, obwohl dies der Fall ist.
Ich habe versucht, diesen Code hinzuzufügen:
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);
in HttpClientStack
des Volley-Frameworks zu einer anderen Ganzzahl (50000), aber es läuft immer noch vor 50 Sekunden ab.
Gibt es eine Möglichkeit, das Zeitlimit auf einen langen Wert zu ändern?
android
timeout
android-volley
Cissmayazz
quelle
quelle
HttpClient
Klasse.Antworten:
Siehe
Request.setRetryPolicy()
und den Konstruktor fürDefaultRetryPolicy
zquelle
Um mit Android Volley Timeout umzugehen, müssen Sie verwenden
RetryPolicy
RetryPolicy
RetryPolicy
ist eine Schnittstelle, in der Sie Ihre Logik implementieren müssen, wie Sie eine bestimmte Anforderung wiederholen möchten, wenn eine Zeitüberschreitung auftritt.Es befasst sich mit diesen drei Parametern
Zum Beispiel. Wenn RetryPolicy mit diesen Werten erstellt wird
Wiederholungsversuch 1:
Wiederholungsversuch 2:
Wenn also am Ende von Wiederholungsversuch 2 immer noch ein Socket-Timeout auftritt, wirft Volley einen
TimeoutError
Fehlerbehandlungs-Handler für die Benutzeroberfläche.quelle
RetryPolicy
Implementierung tatsächlich tut.new DefaultRetryPolicy(
und stellen Sie sicher, dass einRetryPolicy
Objekt niemals wiederverwendet wird, da auf das Objekt während des gesamten Anforderungsprozesses verwiesen wird. Wiederholungsinkremente werden über denselben Objekt-Timeout-Wert hinzugefügt, sodass Ihre zukünftigen Anforderungszeitlimits unendlich wachsenNur um mit meinem Ansatz beizutragen. Wie bereits beantwortet,
RetryPolicy
ist der Weg zu gehen. Wenn Sie jedoch für alle Ihre Anforderungen eine andere als die Standardrichtlinie benötigen, können Sie diese in einer Basisanforderungsklasse festlegen, sodass Sie die Richtlinie nicht für alle Instanzen Ihrer Anforderungen festlegen müssen.Etwas wie das:
In meinem Fall habe ich eine GsonRequest, die sich von dieser BaseRequest aus erstreckt, sodass ich nicht das Risiko eingehen muss, die Richtlinie für eine bestimmte Anforderung zu vergessen, und Sie können sie trotzdem überschreiben, wenn eine bestimmte Anforderung dies erfordert.
quelle
quelle
Sie können
MY_SOCKET_TIMEOUT_MS
100 einstellen . Was auch immer Sie einstellen möchten, ist in Millisekunden.DEFAULT_MAX_RETRIES
kann 0 sein Standard ist 1.quelle
quelle
Eine andere Möglichkeit ist die benutzerdefinierte JsonObjectRequest von:
Quelle: Android Volley Beispiel
quelle
Alternative Lösung, wenn alle oben genannten Lösungen für Sie nicht funktionieren
Standardmäßig hat Volley das Timeout für beide gleichermaßen
setConnectionTimeout()
undsetReadTimeout()
mit dem Wert von festgelegtRetryPolicy
. In meinem Fall wird eineVolley
Timeout-Ausnahme für große Datenmengen ausgelöst. Siehe:Meine Lösung besteht darin, eine Klasse zu erstellen, die sich
HttpStack
auf meine eigenesetReadTimeout()
Richtlinie erstreckt. Verwenden Sie es dann beim ErstellenRequestQueue
wie folgt:quelle
Ich landete das Hinzufügen einer Methode
setCurrentTimeout(int timeout)
zu derRetryPolicy
und der Umsetzung inDefaultRetryPolicy
.Dann habe ich ein
setCurrentTimeout(int timeout)
in der Request-Klasse hinzugefügt und es aufgerufen.Dies scheint den Job zu machen.
Entschuldigung für meine Faulheit übrigens und Hurra für Open Source.
quelle