RxAndroid 一个接一个地调用网络调用
RxAndroid call one network call after another
我是 RxJava 的新手。我有一个场景,我想调用第一个登录 web 服务 (getLoginObservable
),成功后,想调用另一个 web 服务 (getFetchDataObservable
) 来获取用户信息。
如果登录成功,我将使用以下代码。但我无法弄清楚如何编码 failure
案例。
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;
}
});
});
}
就我对 RxJava 的了解而言,我可以弄清楚 getLoginObservable(editTextUsername.getText().toString(), password)
observable 将响应发送到地图 (map(response -> { ... }
) 并且此地图 return 响应到平面图 (flatMap(response -> { ... }
) 并将其响应发送给订阅者。在这里,我只是迷失了如何跳过(第二次网络调用)flatmap flatMap(response -> { ... }
以在登录失败的情况下直接向订阅者发送响应。
而不是:
.map(response -> {
if (response.result) {
getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question);
}
return response;
})
您可以使用:
flatMap(response-> {
if (response.result) {
getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question);
return Observable.just(response);
} else {
return Observable.error(new Exception("Login failed")); // or maybe some LoginFailedException() you can reuse
}
})
我是 RxJava 的新手。我有一个场景,我想调用第一个登录 web 服务 (getLoginObservable
),成功后,想调用另一个 web 服务 (getFetchDataObservable
) 来获取用户信息。
如果登录成功,我将使用以下代码。但我无法弄清楚如何编码 failure
案例。
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;
}
});
});
}
就我对 RxJava 的了解而言,我可以弄清楚 getLoginObservable(editTextUsername.getText().toString(), password)
observable 将响应发送到地图 (map(response -> { ... }
) 并且此地图 return 响应到平面图 (flatMap(response -> { ... }
) 并将其响应发送给订阅者。在这里,我只是迷失了如何跳过(第二次网络调用)flatmap flatMap(response -> { ... }
以在登录失败的情况下直接向订阅者发送响应。
而不是:
.map(response -> {
if (response.result) {
getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question);
}
return response;
})
您可以使用:
flatMap(response-> {
if (response.result) {
getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question);
return Observable.just(response);
} else {
return Observable.error(new Exception("Login failed")); // or maybe some LoginFailedException() you can reuse
}
})