2015-04-04 103 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

相關問題