2015-04-04 104 views
2

我是rxjava或rxandroid中的新成员,并且正在寻找一种处理多个请求的更好方法。我需要从服务器获取令牌并将结果作为参数进行登录验证,如果它返回成功,则通过getSessionId方法获取sessionId。 我考虑过关于zip或合并,但我不认为它会起作用。所以你能给我一个想法,或者我不知道,思路? 谢谢。有没有更好的方法使用rxjava多个请求?

这里是我的代码:

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

回答

3

你的第一个订阅打电话给你的第二预订,...
你能避免这一点使用flapmap运营商。

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

订阅中的新可观察元素可以由flatMap调用取代。

如果你想管理你的错误,在flatMap中,如果令牌无效,你可以返回一个错误observable,而不是返回新的API调用observable。

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

谢谢,它有很大的帮助。顺便说一下,我可以在Observer中处理所有错误吗?你知道,onError()。 – machinezhou 2015-04-04 10:52:56

+0

这取决于你,但你可以 – dwursteisen 2015-04-04 11:18:10

+0

谢谢,欣赏它 – machinezhou 2015-04-04 14:01:21

相关问题