Android 为什么RxJava中的interval操作符会更改flatMap的结果
我正在运行以下代码:Android 为什么RxJava中的interval操作符会更改flatMap的结果,android,rx-java,reactive-programming,Android,Rx Java,Reactive Programming,我正在运行以下代码: 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
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数到无穷的过程,如1,2,3,4,5,6,7,8,9,10,11,12
我想问题是在我添加
.interval(200, TimeUnit.MILLISECONDS)
但我不知道为什么。interval()
是一种工厂方法,它在可观察的
上定期提供一系列值,从0开始。它是一个源操作符,应该像Observable.interval()
那样静态调用,但您在实例上调用了它。大多数IDE都应该警告您在实例上调用静态方法,因为通常会发生与您预期不同的事情
我怀疑您想要跨越200毫秒间隔的值;RxJava中没有标准的运算符,但这是一个常见的问题(应该已经有了答案)。interval()
是一个工厂方法,它在Observable
上定期提供一系列值,从0开始。它是一个源操作符,应该像Observable.interval()
那样静态调用,但您在实例上调用了它。大多数IDE都应该警告您在实例上调用静态方法,因为通常会发生与您预期不同的事情
我怀疑您想要跨越200毫秒间隔的值;RxJava中没有标准的操作符,但这是一个常见的问题(应该已经有了答案)。我通常使用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);
}
这将延迟每项发射200ms
您可以在这里看到更实际的示例我通常使用一种技巧,使用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);
}
这将延迟每项发射200ms
您可以在这里看到更实际的示例,因此IDE确实警告了我这一点。但是我第一次使用RxJava,所以我不知道该怎么做。最大的问题是,我有另一个用例,其中interval按预期工作(不知道为什么和如何),这给我留下了这样的印象,即我可以使用它来跨越您所说的值。非常感谢。我会寻找你提到的问题的答案,所以IDE确实警告过我这一点。但是我第一次使用RxJava,所以我不知道该怎么做。最大的问题是,我有另一个用例,其中interval按预期工作(不知道为什么和如何),这给我留下了这样的印象,即我可以使用它来跨越您所说的值。非常感谢。我将寻找你提到的问题的答案