订阅现有的observable,除非它已完成

时间:2015-11-30 09:59:00

标签: java reactive-programming rx-java observable

我已经多次需要这样的构造了,我不太清楚如何处理它。我的问题是:当A发生时,我想创建一个复杂的observable(由几个运算符组合而成)。它将异步完成某些操作,发布结果并完成。同时我想允许对这个observable的新订阅,但是一旦它完成,就应该创建新的observable,这是第一个的副本(或者只是做同样的事情)。

(编辑)作为一个例子,让我们有一个简单的可观察:Observable obs = Observable.just(true).delay(1, TimeUnit.SECONDS)。我的目标是以下行为:

[毫秒:行动]

0:obs.subscribe(...) - 我想在~1s之后完成这个可观察的

500:obs.subscribe(...) - 这个应该在~500ms之后完成

950:如上所述,应在50ms后完成

1500:原始观察应该已经完成​​。我现在想重新开始一切,并在1s后完成订阅

2000:在这里我想连接到最新鲜的可观察物并期望它在500秒后完成(因为新的第二个开始计数在1500)

我不太清楚如何以正确和线程安全的方式做到这一点。我可以用一个可观察的吗?

1 个答案:

答案 0 :(得分:2)

您可以使用defershare来实现此目标。

Observable<Long> o = Observable.defer(() ->
    Observable.just(System.currentTimeMillis()).delay(1, TimeUnit.SECONDS))
.share();

o.subscribe(System.out::println);   // T = 0
Thread.sleep(500);
o.subscribe(System.out::println);  // T = 500
Thread.sleep(450);
o.subscribe(System.out::println);   // T = 950

Thread.sleep(550);
o.subscribe(System.out::println);   // T = 1500
Thread.sleep(500);
o.subscribe(System.out::println);   // T == 2000

Thread.sleep(1000);

前3个将在1s之后同时完成(具有相同的值),而后两个将在第一个之后完成1.5s(与第一个具有不同的值)。