FIXED以产生所需的输出!
我有一个项目列表,我需要迭代,并在每个元素之间我想等待2秒。当所有项目都被处理并且订阅被调用时,我想等待另外2秒。
这是我的代码:
rx.Observable.from(new String[] {"Test1", "Test2", "Test3", "Test4"})
.zipWith(rx.Observable.interval(2000, 1000,TimeUnit.MILLISECONDS), (a,b) -> a)
.subscribe(name -> {
System.out.println(name);
}, e -> {
System.out.println("ERROR" + e);
}, () -> {
rx.Observable.timer(4000, TimeUnit.MILLISECONDS)
.subscribe(notUsed -> "THE END!");
});
try {
// Sleep so the program doesn't exit immediately
Thread.sleep(10000);
}
catch (Exception e) {
}
它运行得非常好,但是当它执行'间隔时,在订阅中它打印" THE END!"三次!
TEST1
TEST2
TEST3
TEST4
THE END!
THE END!
THE END!
知道如何改善这个吗?
谢谢!
答案 0 :(得分:2)
嗯,它完全按照你的要求去做: - )
time event
-------------------------------------
0 start, wait 2000 ms initially
2000 emit "Test1", wait 1000 ms
3000 emit "Test2", wait 1000 ms
4000 emit "Test3", wait 1000 ms
5000 emit "Test4", emit the OnCompleted event, wait 2000 ms
7000 print "THE END!", wait 1000 ms
8000 print "THE END!", wait 1000 ms
9000 print "THE END!", wait 1000 ms
10000 main thread dies
我不知道你想要什么,但我认为你只想要一个“THE END!”。如果您希望将此延迟1000毫秒,则必须执行以下操作:
Observable.from(new String[] {"Test1", "Test2", "Test3", "Test4"})
.zipWith(Observable.interval(2000, 1000,TimeUnit.MILLISECONDS), (a,b) -> a)
.concatWith(Observable.timer(1000, TimeUnit.MILLISECONDS).ignoreElements())
.subscribe(
System.out::println,
e -> System.out.println("ERROR" + e),
() -> System.out.println("THE END!));
如果您不希望延迟结束,只需删除上面的concat
。
这concat
所做的是等待第一个序列(from
和zip
)完成,并在Observer
之后订阅OnCompleted
发出第一个序列。订阅第二个序列后,它等待1000毫秒,发出一个元素并完成(因为它是timer
而不是interval
)。因为您忽略了元素(例如OnNext
s),所以只留下OnCompleted
事件,这会触发subscribe
中的回调。
答案 1 :(得分:1)
完成第一个流(Test1-4)后,您可以在延迟**$****$****$**
****$**$**
发送单个值进行连接
复制可管理的代码
Observable