Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有更好的方法将rxjava用于多个请求?_Java_Rx Java - Fatal编程技术网

有没有更好的方法将rxjava用于多个请求?

有没有更好的方法将rxjava用于多个请求?,java,rx-java,Java,Rx Java,我是rxjava或rxandroid新手,正在寻找一种更好的方法来处理多个请求。我需要从服务器获取令牌,并使用结果作为参数进行登录验证,如果返回成功,则通过getSessionId方法获取sessionId。 我已经考虑过压缩或合并,但我认为它行不通。你能给我一个想法吗?或者我不知道,思路? 多谢各位 这是我的密码: private void getToken(final String name , final String pwd){ api.newToken() .subsc

我是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
      }
    });
  }
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中处理所有的错误吗?你知道,那要视情况而定,但你可以谢谢你,谢谢你