我正在查看以下内容:
// class member
var myPublishSubject = PublishSubject.create<SomeObservable>()
// later on in the class somewhere:
while(true){
myPublishSubject.onNext(someObservable)
}
我想停止发射,但是while循环永远继续。因此,我希望onNext调用不执行任何操作。但是我担心如果我调用myPublishSubject.onComplete(),最终该主题将为空,并且我会得到NPE。即使重复调用onNext(),也只是为了使其静音而已。退订是最好的方法吗?
答案 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
希望这种方法能在您的请求中为您提供帮助