是否有更好的方法使用rxjava多个请求?

时间:2015-04-04 09:18:26

标签: java rx-java

我是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
      }
    });
  }

1 个答案:

答案 0 :(得分:3)

您的第一个订阅会致电您的第二个订阅,...
您可以使用flapmap运算符来避免这种情况。

api.newToken(...)
     .flapMap(token -> api.validateToken(token))
     .flapMap(token -> api.newSession(token)).subscribe()

订阅中的新observable可以替换为flatMap调用。

如果要在flatMap中管理错误,如果令牌无效,则可以返回错误observable而不是返回新的api调用observable。

.flatMap(token -> if(token.isValid){ return api.newCall(); } else { return Observable.error(...); ;)