之间有什么区别:
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);
}
})
第二种是更清洁但实际上并考虑到背压,这两种解决方案的行为方式是否相同?
答案 0 :(得分:13)
根据您的源可观察量(在本例中为just("MyString")
),可能会有一些差异:
interval()
将每秒运行一次(如果可能),而repeatWhen()
将始终delay()
1秒。对于just()
这并不重要,但如果您的源需要一段时间才能运行(例如500毫秒),那么您会看到时间上的差异:interval()
将每1,000毫秒重新订阅,但是{{ 1}}每1,500ms运行一次(500ms输出+ 1,000ms延迟)。
如果您的来源更长超过一秒,那么每次重新订阅与repeatWhen(delay())
之间不会有暂停,因为它只会等到上一个{{1}在执行另一个之前完成!
如果您在interval()
中使用flatMap()
,则可以实现Scheduler
无法实现的某些并行化。同样,这对于flatMap()
来说并不重要,但对于长期运行的repeatWhen()
来说却是如此。有关详情,请查看this great article。
我不相信这些所有两者之间的差异,更熟悉RxJava的内部人员可能会指出更多。