我已经多次需要这样的构造了,我不太清楚如何处理它。我的问题是:当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)
我不太清楚如何以正确和线程安全的方式做到这一点。我可以用一个可观察的吗?
答案 0 :(得分:2)
您可以使用defer
和share
来实现此目标。
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(与第一个具有不同的值)。