2017-01-14 24 views
1

我能想到的兩種方式來獲得從單單RxJava如何提取對象

Single<HotelResult> observableHotelResult = 
          apiObservables.getHotelInfoObservable(requestBody); 

final HotelResult[] hotelResults = new HotelResult[1]; 
    singleHotelResult 
      .subscribe(hotelResult -> { 
       hotelResults[0] = hotelResult; 
      }); 

或者

final HotelResult hotelResult = singleHotelResult 
            .toBlocking() 
            .value(); 

這是寫我們應該避免使用.toBlocking方法的文檔中的值。

那麼,有沒有更好的方式來獲得價值

+1

https://github.com/ReactiveX/RxJava/issues/3956 –

回答

2

當我們使用toBlocking那麼我們馬上得到結果。當我們使用subscribe時,結果是異步獲得的。

Single<HotelResult> observableHotelResult = 
    apiObservables.getHotelInfoObservable(requestBody); 

final HotelResult[] hotelResults = new HotelResult[1]; 
singleHotelResult.subscribe(hotelResult -> { 
    hotelResults[0] = hotelResult; 
}); 
// hotelResults[0] may be not initialized here yet 
// println not show result yet (if operation for getting hotel info is long) 
System.out.println(hotelResults[0]); 

阻斷情況:

final HotelResult hotelResult = singleHotelResult.toBlocking().value(); 
// hotelResult has value here but program workflow will stuck here until API is being called. 

toBlocking幫助的情況下,當您在「正常」的代碼,你需要有結果的地方使用觀測量。

subscribe幫助您例如在Android應用程序時,你可以設置像演藝結果subscribe一些動作的網頁上,請禁用按鈕等

+0

我想等到結果被提取。所以即使在訂閱的情況下,我也沒有提到任何調度程序,所以這也是一個同步調用(在我看來)。對於我的用例,我只能阻止可觀察。 – Deepanshu

0

即使不建議阻止它(你應該訂閱)在RxJava v2中,阻塞的方法是blockingGet(),它立即返回對象。