【发布时间】:2016-12-22 05:45:16
【问题描述】:
我正在寻找可以:
- 如果没有订阅者,可以接收项目并将它们保存在队列或缓冲区中
- 一旦我们有了订阅者,所有的项目都会被消耗掉,并且永远不会再次发出
- 我可以订阅/取消订阅主题/从主题
BehaviorSubject 几乎可以完成这项工作,但它保留了最后观察到的项目。
更新
根据接受的答案,我为单个观察到的项目制定了类似的解决方案。还添加了取消订阅部分以避免内存泄漏。
class LastEventObservable private constructor(
private val onSubscribe: OnSubscribe<Any>,
private val state: State
) : Observable<Any>(onSubscribe) {
fun emit(value: Any) {
if (state.subscriber.hasObservers()) {
state.subscriber.onNext(value)
} else {
state.lastItem = value
}
}
companion object {
fun create(): LastEventObservable {
val state = State()
val onSubscribe = OnSubscribe<Any> { subscriber ->
just(state.lastItem)
.filter { it != null }
.doOnNext { subscriber.onNext(it) }
.doOnCompleted { state.lastItem = null }
.subscribe()
val subscription = state.subscriber.subscribe(subscriber)
subscriber.add(Subscriptions.create { subscription.unsubscribe() })
}
return LastEventObservable(onSubscribe, state)
}
}
private class State {
var lastItem: Any? = null
val subscriber = PublishSubject.create<Any>()
}
}
【问题讨论】:
-
你看到我的回答了吗?
-
澄清你的意思是“一旦我们有一个订阅者,所有的项目都被消耗了,再也不会发射了”——如果你有类似的东西:yourSource.take(1).subscribe(),那应该消失吗yourSource 中的所有项目?
-
不,应该只消耗那个物品。
标签: rx-java