我只是用takeUntil
-
final Observable<Integer> stopper = Observable.just(1)
.doOnComplete(() -> view.append("second stream complete"))
.delay(500, TimeUnit.MILLISECONDS);
return Observable
.range(0, 10)
.zipWith(Observable.interval(100, TimeUnit.MILLISECONDS), (item, interval) -> item)
.takeUntil(stopper)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(view::append);
因此,理想情况下,塞子会在500毫秒后发射并终止第二个可观察到的物体,它确实会这样做。但是doOnComplete
立即打印。
据我从文档中了解-delay
将事件及时转移-包括完整事件。那么为什么会这样呢?
答案 0 :(得分:1)
根据documentation,Observable.just()
立即完成-因此消息将立即打印出来。
如果您希望在延迟后打印该消息,则应这样修改
Observable.just(1)
.delay(500, TimeUnit.MILLISECONDS)
.doOnComplete(() -> view.append("second stream complete"))
答案 1 :(得分:1)
如果查看just的源代码(即ObservableScalarXMap.java中的ScalarDisposable)运算符,您会发现它所做的只是发出一个带有提供的值的onNext
事件,此后立即它发出onComplete
事件。在您的示例中,您已将doOnComplete
放在delay
运算符之前-这就是为什么doOnComplete
立即被调用,并且此后事件被延迟500ms的原因。