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按预期工作(不知道为什么和如何),这给我留下了这样的印象,即我可以使用它来跨越您所说的值。非常感谢。我将寻找你提到的问题的答案