Desidero eseguire 2 chiamate di rete in modo asincrono: sto utilizzando Retrofit + RxJava per ottenere ciò. Questa logica proviene da una semplice classe Runner per testare la soluzione. NOTA: Questo riguarda principalmente RxJava sul lato server.Uso corretto di Retrofit + RxJava's combineLatest
Il mio codice presenta come di seguito:
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
}
});
}
tre domande:
- È
Observable.combineLatest
l'operatore migliore da utilizzare quando si desidera eseguire più REST chiama in modo asincrono e procedere quando tutte le chiamate hanno finito ? - L'implementazione
Func2
attualmente restituisceString
. Dopo l'esecuzione delle 2 chiamate API, elaborerò i risultati nel metodoFunc2#call()
. Non mi interessa cosa viene restituito - ci deve essere un modo migliore per gestire questo, però - ho ragione? - Le chiamate API sono eseguite correttamente con il codice sopra. Ma il metodo
main
non completa con il correttoProcess finished with exit code 0
quando eseguo il programma. Cosa potrebbe causare il blocco del codice?
AGGIORNAMENTO - 2015-05-14
Sulla base della raccomandazione, ho cambiato la logica per la seguente:
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();
}
Questo appare come la soluzione ero cercando. Lo userò per un po 'di tempo per vedere se mi imbatto in problemi.
Grazie, ho aggiornato il mio esempio di codice con i tuoi consigli. – Kasa