如何在RxJava中明确表示Flowable的完成?

时间:2017-02-11 13:50:48

标签: java kotlin rx-java2

我试图创建一个包裹Flowable的{​​{1}}。我会定期将元素推送到Iterable,但似乎完成事件是隐含的。我不知道如何表示处理已完成。例如,在我的代码中:

Iterable

打印:

  

1   2   3   4   完成

我检查了 // note that this code is written in Kotlin val iterable = LinkedBlockingQueue<Int>() iterable.addAll(listOf(1, 2, 3)) val flowable = Flowable.fromIterable(iterable) .subscribeOn(Schedulers.computation()) .observeOn(Schedulers.computation()) flowable.subscribe(::println, {it.printStackTrace()}, {println("completed")}) iterable.add(4) Thread.sleep(1000) iterable.add(5) Thread.sleep(1000) 界面的来源,但似乎我无法发出Flowable明确完成的信号。我怎么能这样做?在我的程序中,我发布了它们之间有一些延迟的事件,我想明确何时Flowable事件流。

澄清: 我有一个长时间运行的过程,发出事件。我将它们收集在一个队列中,并且我公开了一个返回Flowable的方法,该Flowable包裹着我的队列。问题是当我创建Flowable时队列中可能已经存在元素。我只会处理一次事件,我知道事件流程何时停止,所以我知道何时需要完成Flowable。

2 个答案:

答案 0 :(得分:4)

使用.fromIterable是为您的用例创建Flowable的错误方法 我实际上并不清楚该用例是什么,但您可能想要使用Flowable.create()PublishSubject

val flowable = Flowable.create<Int>( {
    it.onNext(1)
    it.onNext(2)
    it.onComplete()
}, BackpressureStrategy.MISSING)

val publishSubject = PublishSubject.create<Int>()
val flowableFromSubject = publishSubject.toFlowable(BackpressureStrategy.MISSING)
//This data will be dropepd unless something is subscribed to the flowable.
publishSubject.onNext(1)
publishSubject.onNext(2)
publishSubject.onComplete()

当然,如何处理背压将取决于数据来源的性质。

答案 1 :(得分:2)

像akarnokd建议的那样,ReplayProcessor完全按照你的意愿行事。将iterable.add(item)替换为processor.onNext(item),并在完成后致电processor.onComplete()