我正在运行此代码:
private void concatenatedSets() {
Observable<String> concatenatedSets =
Observable.just("1/5/8", "1/9/11/58/16/", "9/15/56/49/21");
concatenatedSets.flatMap(s -> Observable.from(s.split("/")))
.map(s -> Integer.valueOf(s))
.interval(200, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Long>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Long aLong) {
tvCounter.setText(String.valueOf(aLong));
}
});
}
预期输出为
1
5
8
1
9
11
58
16
9
15
56
49
21
然而,我得到的是无休止的从1到无穷大的会话,如1,2,3,4,5,6,7,8,9,10,11,12 ......
我认为问题是在我添加
之后出现的.interval(200, TimeUnit.MILLISECONDS)
但我不知道为什么。
答案 0 :(得分:2)
interval()
是Observable
上的工厂方法,它定期为您提供一系列值,从0开始。它是一个源操作符,应该像Observable.interval()
一样静态调用,但是你在一个实例上调用它。大多数IDE应警告您在实例上调用静态方法,因为通常会发生与您预期不同的事情。
我怀疑你想要超出200毫秒的值;在RxJava中没有标准的运算符,但在SO上是一个常见的问题(并且应该已经有了答案)。
答案 1 :(得分:1)
我通常使用一种技巧,使用zip运算符将项目列表与间隔组合起来。看看代码。
@Test
public void concatenatedSets() {
Subscription subscription =
Observable.just("1/5/8", "1/9/11/58/16/", "9/15/56/49/21")
.flatMap(s -> Observable.zip(Observable.from(s.split("/")), Observable.interval(200, TimeUnit.MILLISECONDS), (i, t) -> i))
.map(Integer::valueOf)
.subscribeOn(Schedulers.computation())
.observeOn(Schedulers.io())
.subscribe(System.out::println);
new TestSubscriber((Observer) subscription)
.awaitTerminalEvent(1000, TimeUnit.MILLISECONDS);
}
这会延迟每个项目发出200毫秒
您可以在此处查看更多实用示例https://github.com/politrons/reactive