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

Any*_*324 7 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");
            }
        })
Run Code Online (Sandbox Code Playgroud)

和:

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);
            }
        })
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*Lew 13

根据您的源可观察性(在这种情况下just("MyString")),可能会有一些差异:

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

    如果您的源需要更长超过一秒钟,然后就会出现每间重新订阅没有停顿interval(),因为它只会等到前flatMap()正在执行一个又一个做过!

  2. 如果你使用a Scheduler,flatMap()那么你可以实现一些不可能的并行化repeatWhen().同样,这并不重要just(),但它会长期运行Observable.有关更多信息,请查看这篇精彩的文章.

我不相信这是所有两者之间的差异,有人谁是更熟悉RxJava的内部大概可以点多了出来.