interval()和repeatWhen()之间的区别,用于从间隔中的Observable进行轮询

时间:2016-03-03 11:21:52

标签: rx-java

之间有什么区别:

Observable<String> observable = Observable
        .interval(0, 1, TimeUnit.SECONDS)
        .flatMap(new Func1<Long, Observable<String>>() {
            @Override
            public Observable<String> call(Long aLong) {
                return Observable.just("MyString");
            }
        })

Observable<String> observable = Observable.just("MyString")
        .repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
            @Override
            public Observable<?> call(Observable<? extends Void> completed) {
                return completed.delay(1, TimeUnit.SECONDS);
            }
        })

第二种是更清洁但实际上并考虑到背压,这两种解决方案的行为方式是否相同?

1 个答案:

答案 0 :(得分:13)

根据您的源可观察量(在本例中为just("MyString")),可能会有一些差异:

  1. interval()将每秒运行一次(如果可能),而repeatWhen()将始终delay() 1秒。对于just()这并不重要,但如果您的源需要一段时间才能运行(例如500毫秒),那么您会看到时间上的差异:interval()将每1,000毫秒重新订阅,但是{{ 1}}每1,500ms运行一次(500ms输出+ 1,000ms延迟)。

    如果您的来源更长超过一秒,那么每次重新订阅与repeatWhen(delay())之间不会有暂停,因为它只会等到上一个{{1}在执行另一个之前完成!

  2. 如果您在interval()中使用flatMap(),则可以实现Scheduler无法实现的某些并行化。同样,这对于flatMap()来说并不重要,但对于长期运行的repeatWhen()来说却是如此。有关详情,请查看this great article

  3. 我不相信这些所有两者之间的差异,更熟悉RxJava的内部人员可能会指出更多。