RXJava2: richtige pattern-chain-retrofit-Anforderungen
Ich bin relativ neu in RXJava im Allgemeinen (eigentlich nur begann, es zu benutzen mit RXJava2), und die meisten Unterlagen, die ich finden kann, neigt dazu, RXJava1; ich kann in der Regel übersetzen zwischen den beiden jetzt, aber der gesamte Reaktive Zeug ist so groß, dass es eine überwältigende API mit guter Dokumentation (wenn Sie es finden können). Ich bin versucht zu rationalisieren mein code, ich möchte es mit kleinen Schritten. Das erste problem, das ich lösen will, ist dieses gemeinsame Muster, das ich eine Menge in meinem aktuellen Projekt:
Haben Sie eine Anforderung, die, wenn Sie erfolgreich ist, verwenden Sie eine zweite Anfrage.
Entweder, wenn Sie fehlschlägt, müssen Sie in der Lage sein zu erkennen das man versagt. (meist für die Anzeige von benutzerdefinierten UI-Warnungen).
Dies ist, wie ich in der Regel tun Sie es jetzt:
(weggelassen .subscribeOn/observeOn
für Einfachheit)
Single<FirstResponse> first = retrofitService.getSomething();
first
.subscribeWith(
new DisposableSingleObserver<FirstResponse>() {
@Override
public void onSuccess(final FirstResponse firstResponse) {
//If FirstResponse is OK…
Single<SecondResponse> second =
retrofitService
.getSecondResponse(firstResponse.id) //value from 1st
.subscribeWith(
new DisposableSingleObserver<SecondResponse>() {
@Override
public void onSuccess(final SecondResponse secondResponse) {
//we're done with both!
}
@Override
public void onError(final Throwable error) {
//2nd request Failed,
}
});
}
@Override
public void onError(final Throwable error) {
//firstRequest Failed,
}
});
Gibt es eine bessere Möglichkeit, damit umzugehen, in RXJava2?
Ich habe versucht flatMap
- und Varianten-und sogar ein Single.zip
oder ähnliches, aber ich bin mir nicht sicher, was die einfachste und verbreitetste Muster ist die Auseinandersetzung mit dieser.
Falls Sie sich Fragen, FirstRequest holt eine tatsächliche Token
ich brauche in der SecondRequest. Kann nicht zweite Anforderung ohne den token.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde vorschlagen, mit flachen Karte (Und retrolambda, wenn das ist eine option).
Auch brauchen Sie nicht zu halten die Rückgabewert (e.g
Single<FirstResponse> first
), wenn Sie nicht etwas zu tun mit es.Diese Artikel hat mir geholfen, denken Sie über Stile, wie ich Struktur RxJava im Allgemeinen. Sie wollen Ihre Kette, um eine Liste der high-level-Aktionen, wenn möglich, es kann also gelesen werden als eine Sequenz von Aktionen/Transformationen.
BEARBEITEN
Ohne lambdas können Sie einfach eine
Func1
für Ihre flatMap. Macht das gleiche nur viel mehr-boiler-plate-code.Func1
istFunction
.Tut dies nicht für Sie arbeiten?
.onErrorResumeNext(e -> {updateUIState(e); return Observable.empty();})
. Oder sogar.doOnError(e -> updateUIState(e))
, wenn Sie OK mit dem sammeln alle Fehler, die sich in Ihrer Abonnenten.