RxJava-即使调用onNext(),如何也阻止PublishSubject发布

时间:2019-01-25 01:43:42

标签: rx-java rx-java2 publishsubject

我正在查看以下内容:

// class member
var myPublishSubject = PublishSubject.create<SomeObservable>()
// later on in the class somewhere:    
while(true){
   myPublishSubject.onNext(someObservable)
}

我想停止发射,但是while循环永远继续。因此,我希望onNext调用不执行任何操作。但是我担心如果我调用myPublishSubject.onComplete(),最终该主题将为空,并且我会得到NPE。即使重复调用onNext(),也只是为了使其静音而已。退订是最好的方法吗?

2 个答案:

答案 0 :(得分:0)

少量笔记

这几乎是一种罕见的情况,但是如果您可以通过Observable向我们展示您的真实意图,我们可能会帮助您设计它,即使不是最好的,也更好。

您可以做什么

在我的示例中,我仅使用了一个非常简单的标志变量,可以在项目的任何触发器上对其进行更改。

选项1

您可以直接在主题发布者上调用onComplete

var maxEmittedItemCount = 10
var currentEmittedItemCount = 0
var someStringValue = "Some observable" // Create whatever observable you have
var publishSubject = PublishSubject.create<String>()

publishSubject.subscribe({
    currentEmittedItemCount++
    System.out.println(it)
}, {
    System.out.println(it)
})

while (true) {
    // Publish value on the subject
    publishSubject.onNext(someStringValue)

    // Test flag for trigger
    if (currentEmittedItemCount == maxEmittedItemCount) publishSubject.onComplete()

    // Print indication that the loop is still running
    System.out.println("Still looping")
}

选项2

您还可以保留对订阅的引用,然后再对其进行处理,这比前一个语义多一点,因为在处理资源时,它将执行代码块而无需调用onNext(t)

lateinit var disposable: Disposable // Will hold reference to the subscription
var maxEmittedItemCount = 10
var currentEmittedItemCount = 0
var someStringValue = "Some observable" // Create whatever observable you have
var publishSubject = PublishSubject.create<String>()

disposable = publishSubject.subscribeWith(object : DisposableObserver<String>() {
    override fun onComplete() {
        // Print indication of completion for the subject publisher
        System.out.println("Complete")
    }

    override fun onNext(t: String) {
        // Test flag count synchonizer
        currentEmittedItemCount++

        // Print out current emitted item count
        System.out.println(currentEmittedItemCount)

        // Print current string
        System.out.println(t)
    }

    override fun onError(e: Throwable) {
        // Print error
        System.out.println(e)
    }
})

while (true) {
    // Publish value on the subject
    if (!disposable.isDisposed) publishSubject.onNext(someStringValue)

    // Test flag for trigger
    if (currentEmittedItemCount == maxEmittedItemCount) {
        publishSubject.onComplete() // optional if you need to invoke `onComplete()` block on the subject
        disposable.dispose()
    }

    // Print indication that the loop is still running
    System.out.println("Still looping")
}

了解更多信息

答案 1 :(得分:0)

在观察者被订阅后,我们必须调用unsubscribe以避免多次onNext调用。

我建议在完成 subject.onNext()的工作后致电 onComplete

这是一个例子

==

然后在观察者中,我们重新创建另一个 PublishSubject 实例

String

希望这种方法能在您的请求中为您提供帮助