SIngle RxJava如何提取对象

时间:2017-01-14 07:25:53

标签: java rx-java system.reactive rx-android

我可以想到两种方法从Single

获取值
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方法。

有没有更好的方法来获得价值

2 个答案:

答案 0 :(得分:3)

当我们使用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有助于您在&#34;正常&#34;中使用Observables的情况您需要获得结果的代码。

subscribe可帮助您在Android应用程序中为您提供帮助,例如在subscribe中设置一些操作,例如在页面上显示结果,禁用制作按钮等。

答案 1 :(得分:2)

即使不建议阻止它(你应该订阅),在RxJava v2中阻塞的方法是blockingGet(),它会立即返回对象。