Ich möchte asynchron zwei Netzwerkaufrufe durchführen - ich verwende Retrofit + RxJava, um dies zu erreichen. Diese Logik stammt aus einer einfachen Runner-Klasse, um die Lösung zu testen. HINWEIS: Dies betrifft hauptsächlich RxJava auf der Serverseite.Korrekte Verwendung von Retrofit + RxJava's combateLatest
Mein Code sieht wie folgt aus:
public static void main(String[] args) throws Exception {
Api api = ...;
Observable.combineLatest(
api.getStates(),
api.getCmsContent(),
new Func2<List<States>, CmsContent, String>() {
@Override public String call(List<State> states, CmsContent content) {
...
return "PLACEHOLDER";
}
})
.observeOn(Schedulers.immediate())
.subscribeOn(Schedulers.immediate())
.subscribe(new Observer<String>() {
@Override public void onCompleted() {
System.out.println("COMPLETED");
}
@Override public void onError(Throwable e) {
System.out.println("ERROR: " + e.getMessage());
}
@Override public void onNext(String s) {
// I don't care what's returned here
}
});
}
Drei Fragen:
- Ist
Observable.combineLatest
der beste Operator zu verwenden, wenn Sie mehrere REST Anrufe asynchron ausführen wollen und gehen, wenn alle Anrufe beendet haben ? - Meine
Func2
Implementierung gibt derzeit einString
. Nachdem die 2 API-Aufrufe ausgeführt wurden, werden die Ergebnisse innerhalb derFunc2#call()
-Methode verarbeitet. Es ist mir egal, was zurückgegeben wird - es muss einen besseren Weg geben, damit umzugehen - bin ich richtig? - Die API-Aufrufe werden korrekt mit dem obigen Code ausgeführt. Aber die
main
Methode wird nicht mit dem richtigenProcess finished with exit code 0
abgeschlossen, wenn ich das Programm ausführen. Was könnte dazu führen, dass der Code hängen bleibt?
UPDATE - 2015-05-14
auf Empfehlung Basierend habe ich die Logik wie folgt geändert:
public static void main(String[] args) throws Exception {
Api api = ...;
Observable.zip(
api.getStates(),
api.getCmsContent(),
new Func2<List<States>, CmsContent, Boolean>() {
@Override public Boolean call(List<State> states, CmsContent content) {
// process data
return true;
}
})
.subscribeOn(Schedulers.io())
.toBlocking()
.first();
}
Diese Lösung sieht aus wie ich war Auf der Suche nach. Ich werde es einige Zeit benutzen, um zu sehen, ob ich irgendwelche Probleme habe. Kein
Danke, ich habe meine Codebeispiel mit Ihren Empfehlungen aktualisiert. – Kasa