Cadena de dos observables de actualización con RxJava
Quiero ejecutar 2 llamadas de red una tras otra. Ambas llamadas de red devuelven Observable. La segunda llamada usa datos del resultado exitoso de la primera llamada, el método en el resultado exitoso de la segunda llamada usa datos deambos resultado exitoso de la primera y de la segunda convocatoria. También debería ser capaz de manejarambos onError "eventos" de manera diferente. ¿Cómo puedo lograr esto evitando el infierno de devolución de llamada como en el ejemplo a continuación:
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();
}
});
Sé acerca de zip, pero quieroevitar creando "Combiner class".
Actualización 1. Intenté implementar la respuesta de 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);
}
}));
Sin embargo por dentroflatMap
El compilador de métodos dice que no puede resolver los métodos de authResponse y los usuarios (authResponse.getAccessToken()
, users.get(0)
etc) Soy nuevo en la programación de rx y lambdas, por favor dime cuál es el problema. De todos modos, el código se ve mucho más limpio ahora.
Actualización 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);
}));
Lo he hecho así, pero ahora mis llamadas de red no se están ejecutando en absoluto.