2017-04-13 16 views
2

我是RXJava/RXAndroid上的新手。我想要實現這種情況:根據RXJava中的某些條件選擇不同的方式。 例如,我首先從網絡獲取用戶信息,如果這是一個VIP用戶,我將繼續從網絡獲取更多信息,或者只是在主線程中顯示一些信息(打破鏈條)。這裏的流程圖:https://i.stack.imgur.com/0hztR.png如何在RX java鏈中使用「if-else」?

我對此做了一些搜索,只找到「switchIfEmpty」可能會有所幫助。 我寫了下面的代碼:

getUserFromNetwork("userId") 
       .flatMap(new Function<User, ObservableSource<User>>() { 
        @Override 
        public ObservableSource<User> apply(User user) throws Exception { 
         if(!user.isVip){ 
          //show user info on MainThread! 
          return Observable.empty(); 
         }else{ 
          return getVipUserFromNetwork("userId"); 
         } 
        } 
       }).switchIfEmpty(new ObservableSource<User>() { 
        @Override 
        public void subscribe(Observer<? super User> observer) { 
         //show user info in main thread 
         //just break the chain for normal user 
         observer.onComplete(); 
        } 
       }).doOnNext(new Consumer<User>() { 
        @Override 
        public void accept(User user) throws Exception { 
         //show vip user info in main thread 
        } 
       }).subscribe(); 

有沒有更簡單的方式來實現這一目標?

謝謝!

+1

這就是你可以做的最好的。你的代碼沒有問題。 –

回答

7

flatMap()是一個不錯的選擇,你可以用它拆分流,但最後流合併在一起(每個拆分觀察到的所有排放流都流向主流)。 在你的代碼中,switchIfEmpty()是多餘的,因爲這正是Observable.empty()所做的(立即調用onCompleted()),並且當然你還需要觀察器,如果你想讓顯示在主線程上發生,但無論如何,我認爲它不是在流中間處理這個問題的良好做法。

我認爲對於您的情況,您可以處理(反應)單個處理程序中的用戶排放,因爲它非常相似,只需檢查它是否爲VIP並相應地顯示它。 所以它應該是這個樣子:

getUserFromNetwork("userId") 
      .flatMap(new Function<User, ObservableSource<User>>() { 
       @Override 
       public ObservableSource<User> apply(User user) throws Exception { 
        if (!user.isVip) { 
         return Observable.just(user); 
        } else { 
         return getVipUserFromNetwork("userId"); 
        } 
       } 
      }) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(user -> { 
       if (user.isVip){ 
        //display vip user 
       }else{ 
        //display regular user 
       } 
      }); 

在這種方法中,你有一個單一的數據流流,而不在流中間「副作用」。

如果你正在處理的是完全不同的(這不是這種情況),那麼你可以將流分成2個獨立的流並對每個流作出不同的反應,這可以通過多播你的getUserFromNetwork() Observable來完成,這Observable創建2個不同Observable,一個將繼續例如getVipUserFromNetwork(),一個不,並且每個可以有不同的用戶邏輯。 (你可以閱讀here關於組播的回答)

+0

非常感謝您的幫助! –

+0

不客氣,如果這有幫助,請接受答案。謝謝 – yosriz