2017-01-14 4 views
1

я могу думать о двух способов получить значение из единогоSIngle 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(), он немедленно возвращает объект.

Смежные вопросы