【问题标题】:Difference between interval() and repeatWhen() for polling from an Observable in intervalsinterval() 和 repeatWhen() 之间的区别,用于按间隔从 Observable 轮询
【发布时间】:2016-06-16 16:45:44
【问题描述】:

两者有什么区别:

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);
            }
        })

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

【问题讨论】:

    标签: rx-java


    【解决方案1】:

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

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

      如果您的源花费更长超过一秒,那么每次使用 interval() 重新订阅之间不会有暂停,因为它只会等到前一个 flatMap() 完成后再执行另一个一个!

    2. 如果您在flatMap() 中使用Scheduler,那么您可以实现repeatWhen() 无法实现的一些并行化。同样,这对于just() 来说并不重要,但对于长期运行的Observable 来说却很重要。有关更多信息,请查看this great article

    我不确定这些是所有两者之间的区别,更熟悉 RxJava 内部原理的人可能会指出更多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2019-06-10
      • 1970-01-01
      相关资源
      最近更新 更多