我是rxjava或rxandroid的新手,正在寻找一种更好的方式处理多个请求。我需要从服务器获取令牌并将结果用作参数来进行登录验证,如果返回成功,则通过getSessionId方法获取sessionId。
我已经考虑过压缩或合并,但是我认为它不会起作用。那么您能给我一个主意还是不知道,思路?
谢谢。
这是我的代码:
private void getToken(final String name , final String pwd){
api.newToken()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<TokenModel>() {
@Override public void call(TokenModel tokenModel) {
String token = tokenModel.request_token;
if (!"".equals(token)){
login(token, name, pwd);
}else {
Timber.e("got token failed");
}
}
});
}
private void login(String token, String name, String pwd){
api.validateToken(token, name, pwd)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<TokenModel>() {
@Override public void call(TokenModel tokenModel) {
String token = tokenModel.request_token;
if (!"".equals(token)){
getSessionId(token);
}else {
Timber.e("got token failed");
}
}
});
}
private void getSessionId(String token){
api.newSessionn(token)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<TokenModel>() {
@Override public void onCompleted() {
//go to home activity
}
@Override public void onError(Throwable e) {
//handle error
}
@Override public void onNext(TokenModel tokenModel) {
//store session id
}
});
}
最佳答案
您的第一个订阅呼叫您的第二个订阅,...
您可以使用flipmap运算符避免这种情况。
api.newToken(...)
.flapMap(token -> api.validateToken(token))
.flapMap(token -> api.newSession(token)).subscribe()
订阅中可观察到的新内容可以由flatMap调用代替。
如果要管理错误,则在flatMap中,如果令牌无效,则可以返回可观察到的错误,而不是返回可观察到的新api调用。
.flatMap(token -> if(token.isValid){ return api.newCall(); } else { return Observable.error(...); ;)