有没有更好的方法将rxjava用于多个请求?
我是rxjava或rxandroid新手,正在寻找一种更好的方法来处理多个请求。我需要从服务器获取令牌,并使用结果作为参数进行登录验证,如果返回成功,则通过getSessionId方法获取sessionId。 我已经考虑过压缩或合并,但我认为它行不通。你能给我一个想法吗?或者我不知道,思路? 多谢各位 这是我的密码:有没有更好的方法将rxjava用于多个请求?,java,rx-java,Java,Rx Java,我是rxjava或rxandroid新手,正在寻找一种更好的方法来处理多个请求。我需要从服务器获取令牌,并使用结果作为参数进行登录验证,如果返回成功,则通过getSessionId方法获取sessionId。 我已经考虑过压缩或合并,但我认为它行不通。你能给我一个想法吗?或者我不知道,思路? 多谢各位 这是我的密码: private void getToken(final String name , final String pwd){ api.newToken() .subsc
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
}
});
}
private void getToken(最终字符串名,最终字符串pwd){
api.newToken()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新操作1(){
@覆盖公共无效调用(令牌模型令牌模型){
String token=tokenModel.request\u token;
如果(!“”.equals(令牌)){
登录(令牌、名称、密码);
}否则{
Timber.e(“获取令牌失败”);
}
}
});
}
私有无效登录(字符串令牌、字符串名称、字符串pwd){
api.validateToken(令牌、名称、pwd)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新操作1(){
@覆盖公共无效调用(令牌模型令牌模型){
String token=tokenModel.request\u token;
如果(!“”.equals(令牌)){
getSessionId(令牌);
}否则{
Timber.e(“获取令牌失败”);
}
}
});
}
私有void getSessionId(字符串标记){
api.newSessionn(令牌)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新观察员){
@覆盖已完成的公共void(){
//回家活动
}
@覆盖公共无效onError(可丢弃的e){
//处理错误
}
@覆盖公共void onNext(令牌模型令牌模型){
//存储会话id
}
});
}
您的第一次订阅呼叫您的第二次订阅,使用flapmap操作符可以避免这种情况
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(...); ;)
谢谢,这很有帮助。顺便问一下,我能在Observer中处理所有的错误吗?你知道,那要视情况而定,但你可以谢谢你,谢谢你