Desidero eseguire 2 chiamate di rete una dopo l'altra. Entrambe le chiamate di rete restituiscono Observable. Seconda chiamata utilizza i dati dal risultato positivo della prima chiamata, il metodo in esito positivo della seconda chiamata utilizza i dati da sia esito positivo della prima e della seconda chiamata. Inoltre dovrei essere in grado di gestire sia onError "eventi" in modo diverso. Come posso raggiungere questo obiettivo evitando richiamata l'inferno, come nell'esempio qui sotto:Osservazioni retrofit catena due con RxJava
API().auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<AuthResponse>() {
@Override
public void call(final AuthResponse authResponse) {
API().getUser(authResponse.getAccessToken())
.subscribe(new Action1<List<User>>() {
@Override
public void call(List<User> users) {
doSomething(authResponse, users);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onErrorGetUser();
}
});
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onErrorAuth();
}
});
che so di zip, ma voglio evitare di creare "class Combiner".
Update 1. cercato di implementare la risposta di akarnokd:
API()
.auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(authResponse -> API()
.getUser(authResponse.getAccessToken())
.doOnError(throwable -> {
getView().setError(processFail(throwable));
}), ((authResponse, users) -> {
// Ensure returned user is the which was authenticated
if (authResponse.getUserId().equals(users.get(0).getId())) {
SessionManager.getInstance().initSession(email, password, authResponse.getAccessToken(), users.get(0));
getView().toNews();
} else {
getView().setError(R.string.something_went_wrong);
}
}));
Tuttavia all'interno flatMap
metodo compilatore dice che non è possibile risolvere i metodi di authResponse e gli utenti (authResponse.getAccessToken()
, users.get(0)
ecc). Sono nuovo di programmazione Rx e lambda - per favore dimmi qual è il problema. Comunque il codice sembra molto più pulito ora.
Aggiornamento 2.
API()
.auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> getView().setError(processFail(throwable)))
.flatMap((AuthResponse authResponse) -> API()
.getUser(authResponse.getAccessToken())
.doOnError(throwable -> getView().setError(processFail(throwable))), ((AuthResponse authResponse, List<User> users) -> {
// Ensure returned user is the which was authenticated
if (authResponse.getUserId().equals(users.get(0).getId())) {
SessionManager.getInstance().initSession(email, password, authResponse.getAccessToken(), users.get(0));
getView().toNews();
}
return Observable.just(this);
}));
hanno fatto in questo modo, ma ora le mie chiamate di rete non sono in esecuzione a tutti.
sono lontano da un IDE, ma penso che l'errore è dovuto al conflitto lambda nome del parametro . – akarnokd
Sembra che tu non ti abboni più. Assicurati di chiamare .subscribe() sul fondo della catena. –