RxJava的Observable.create与Observable.just(1).flatMap

时间:2015-06-23 16:13:58

标签: java reactive-programming rx-java

我一直在做一些RxJava,我经常发现自己需要将一些现有的代码结果转换为可观察的结果。

例如,让我们采取以下措施:

var r = confirm("Press a button");
if (r == true) {
    x = "You pressed OK!";
} else {
    x = "You pressed Cancel!";
}

因此,将此转换为可观察对象的最简单方法是执行

ListenableFuture<T> result = request.executeAsync();
return result;

问题是ListenableFuture<T> result = request.executeAsync(); return Observable.from(result); 在调用时实际执行了请求。我想要的是延迟该调用直到观察到observable。

我想到了两种方法

executeAsync

return Observable.create { aSubscriber ->
    if (!aSubscriber.unsubscribed) {
        aSubscriber.onNext(request.executeAsync())
    }
    if (!aSubscriber.unsubscribed) {
        aSubscriber.onCompleted()
    }
}

在我看来,使用flatMap选项更简单,因为我不必费心用户逻辑。

使用return Observable .just(1) .flatMap((_) -> Observable.from(request.executeAsync())); 而不是flatMap是否有任何陷阱?是否有一种首选的Rx方式来简化集成?

由于

2 个答案:

答案 0 :(得分:2)

您可以使用延迟代替:

Observable.defer(() -> request.executeAsync())
          .concatMap(Observable::from)
          .subscribe();

答案 1 :(得分:0)

RxJavaGuava是一个小型库,可以为您转换ListenableFutureObservable,因此您最好使用它而不是“自制”解决方案。 它允许你写

ListenableFutureObservable.from(request.executeAsync(), Schedulers.computation())

根据请求的不同,您必须选择正确的调度程序。