2017-01-22 99 views
0

我有一個允許用戶輸入用戶名的編輯文本,一旦輸入用戶名,值被髮送到數據庫以檢查用戶名是否已經存在,如果不是,則允許進一步的操作,否則,錯誤顯示。在流內改造電話

截至目前,這是我目前的代碼。

usernameObservable 
      .skip(2) 
      .debounce(800, TimeUnit.MILLISECONDS) 
      .subscribe(username -> { 
       Observable<Boolean> observable = apiService.isAvailable(username); 
       observable.observeOn(Schedulers.io()) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .subscribe(aBoolean -> { 

         }, throwable -> { 

         }); 
      }); 

對於現在的網絡請求被在端部製成,但是有可能之前發出請求,並且一旦I接收數據我在流上執行一些其它操作。

回答

2

您正在尋找flatMap運營商。它允許你將一個事件轉換成另一個可觀察的事件,這會將發射轉發到原始流。您的錯誤通知也會被轉發。

usernameObservable 
     .skip(2) 
     .debounce(800, TimeUnit.MILLISECONDS) 
     .flatMap(username -> apiService.isAvailable(username)) 
     .subscribe(isAvailableResult -> { 
      // react here 
     }, throwable -> { 
      // show an error here 
     }); 
+0

是否可以在flatMap之後和訂閱之前添加其他運算符?例如,也許是一個過濾器,如果是的話,那麼我會從API調用中收到的數據被處理,還是我的原始可觀察數據被操作? –

+1

當然這是可能的:-)這就是Rx的美麗。一旦你應用了flatMap操作符,它的每個項目都被轉換爲可觀察對象。由您在flatMap中定義的這些observables發出的所有事件將被路由回原始流。因此,在flatMap之後,您將使用與您的方法調用apiService.isAvailable()相對應的API端點的結果。你可以做任何你想要的東西,它是一個普通的流。 – koperko

+1

但是,我看到了我可能會讓你困惑的地方。我沒有在訂閱方法中重命名參數。當然,它不再是用戶名,而是isAvailable()端點的結果。我將編輯我的答案 – koperko