为什么RxJava中的区间运算符会更改flatMap的结果

时间:2016-08-08 13:05:01

标签: 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(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)

但我不知道为什么。

2 个答案:

答案 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