Guter Ansatz, um manuell die retry-requests in Retrofit-Android
Ich verstehe Nachrüstung automatisch Wiederholungsversuche bei Fehlern, aber ich möchte prüfen, ob eine bestimmte Fehlermeldung. Wenn der Fehler durch eine bestimmte HTTP-Codes, die ich brauche, um zu wiederholen, dass der Wunsch nach änderung.
Dies kann leicht getan werden mit synchronen aufrufen, aber ich mache einen asynchronen Aufruf (durch
vorbei Rückrufe). Wenn ich den Fehler in der Rückruf, ich will wiederholen Sie die Anfrage - aber alle die ich habe ist die
RetrofitError Objekt (und ich verloren haben, den request-body).
Habe ich mehrere Anfragen gehen auf die gleiche Aktivität (gleichzeitig) und ich bin also zu vermeiden, speichern Sie alle Anfragen und mediensystemen Sie auf Erfolg.
Gibt es einen besseren Weg, um diese Anforderung zu erfüllen ?
- Hast du überall mit diesem? Derzeit zu implementieren, das auf einer großen Skala und meiner manuellen retry-Ansatz scheint ein wenig aufgebläht.
OkHttp
gerade Hinzugefügt eineInterceptor
, die ist perfekt für diese. Siehe meine Antwort unten.- Cheers, ich werde mal schauen!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie OkHttp als Ihre
HttpClient
und aktualisiert haben, umRetrofit
>=1.9.0
dann können Sie mit der neuen Interceptor. Insbesondere eine Anwendung Interceptor lassen Sieretry and make multiple calls
.Können Sie sehen, Beispiel pseudocode ich geschrieben auf eine ähnliche Frage für die Behandlung von abgelaufenen tokens.
Beachten Sie auch,
Retrofit 2.0
habenInterceptors
nach diese GitHub-ticket. Das entfernen der Abhängigkeit vonOkHttp
auch wenn ich immer noch empfehlen, es zu benutzen.Hier ist, was Sie ausprobieren könnten. Zuerst die Netzwerk-request-Methode:
Hier könnten Sie überprüfen, ob die Anfrage sollte wiederholt werden und gibt true zurück, wenn das sollten wir wiederholen, und false, wenn sollten wir nicht.
Ersten Halbjahr wiederholen prüft, ob der status-code des Fehlers (siehe
r.getStatus()
) entspricht, die jemals den status-code ist für Sie von Interesse (sieheSTATUS_CODE_RETRY
), die könnten auch eine server-status-code (z.B. 401, 404. etc.).Der zweiten Hälfte wiederholen wird zuerst überprüft, um zu sehen, ob es ein Netzwerk-Fehler (siehe
error.isNetworkError()
) und wenn es dann erhöht sich der retry-Zähler und gibt true zurück, was bedeutet, dass das Netzwerk die Anforderung wird wiederholt. Wenn der Fehler ist ein Netzwerk-Fehler (sieheerror.isNetworkError()
) und der retry-Zähler größer als Ihre gewünschten max Anzahl der Wiederholungen (sieheNUM_RETRIES
), dann gibt Sie false zurück, so dass die Anfrage nicht erneut ausgelöst werden. Der nächste Teil ist kein Zusammenhang zu überprüfen, wo ein Netzwerk-Fehler aufgetreten ist, aber es ist nicht ein timeout, so muss es ein Problem mit der Verbindung. Dieser check gibt false zurück, da die Netzwerk-Anfrage sollte nicht wiederholt werden, und der Benutzer sollte über die Verbindungsprobleme. Die abschließende Prüfung ist die nicht Netzwerk Fehler überprüfen, die angibt, dass ein Fehler aufgetreten ist, der nicht ein Ergebnis von einem Netzwerk-Fehler. Wieder einmal, wird false zurückgegeben, damit der Antrag nicht wiederholt, und der Benutzer wird benachrichtigt.Hoffe, dass dies geholfen.
retry
ist wirklich tun?retry
benannt werden solltenshouldRetry
oder ähnliches - es wird überprüft ob die Anfrage sollte wiederholt werden, basierend auf der Anzahl der Wiederholungen, die bereits gemacht und die Art des Fehlers der aktuellen API-Aufruf.retries
variable ingetDataFromServer
Methode, wo kam es aus?