Ich bin neu bei RxJava. Ich habe ein Szenario, in dem ich den ersten Login-Webservice (getLoginObservable
) aufrufen möchte und bei Erfolg einen anderen Webservice (getFetchDataObservable
) aufrufen möchte, um Benutzerinformationen zu erhalten.RxAndroid Anruf ein Netzwerk Anruf nach dem anderen
Ich habe folgenden Code funktioniert, wenn Login erfolgreich ist. Aber ich bin nicht in der Lage, herauszufinden, wie man failure
Fall code.
private void doLogin() {
emailAddress = editTextUsername.getText().toString();
final String password = editTextPassword.getText().toString();
showProgress(null, getString(R.string.loggingInPleaseWait));
getLoginObservable(editTextUsername.getText().toString(), password)
.map(response -> {
if (response.result) {
getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question);
}
return response;
})
.flatMap(response -> {
return getFetchDataObservable();
})
.subscribe(res -> {
dismissProgress();
if (res.result) {
saveInformation(password, res);
} else {
ConstantsMethods.showOkButtonDialog(getContext(), res.message, null);
}
}, e -> {
dismissProgress();
if (e instanceof NoInternetConnectionException) {
ConstantsMethods.showOkButtonDialog(getContext(), getString(R.string.noInternetConnection), null);
}
Log.e(LoginFragment.class.getSimpleName(), e.getMessage());
});
}
private Observable<WsResponse<SecurityQuestion>> getLoginObservable(String userName, String password) {
return Observable.<WsResponse<SecurityQuestion>>create(subscriber -> {
getPresenter().doLogin(getActivity(), userName, password, appType,
new Callback<Void, WsResponse<SecurityQuestion>>() {
@Override
public Void callback(final WsResponse<SecurityQuestion> param) {
subscriber.onNext(param);
return null;
}
});
});
}
private Observable<WsResponse<PatientDataProfile>> getFetchDataObservable() {
return Observable.create(subscriber -> {
new AfPatientsPresenter().fetchPatientData(getContext(), emailAddress, "", new Callback<Void, WsResponse<PatientDataProfile>>() {
@Override
public Void callback(WsResponse<PatientDataProfile> param1) {
subscriber.onNext(param1);
subscriber.onComplete();
return null;
}
});
});
}
Wie viel ich RxJava kenne, kann ich herausfinden, dass getLoginObservable(editTextUsername.getText().toString(), password)
beobachtbaren Sendeverhalten abzubilden (map(response -> { ... }
) und diese Karte Rückkehr Reaktion auf flatmap (flatMap(response -> { ... }
) und seine Antwort an Teilnehmer gesendet. Hier bin ich nur verloren, wie kann ich überspringen (zweiter Netzwerkanruf) flatmap flatMap(response -> { ... }
, Antwort direkt an den Abonnenten im Falle von Login-Fehler zu senden.