arekolek
09/19/2019, 11:16 AMval isRead = AtomicBoolean(false)
val testObservable = Maybe.fromCallable { true.takeUnless { isRead.getAndSet(true) } }.toObservable()
filipradon
09/19/2019, 3:23 PMclass ColdObservableSingleSubscriberProxy<T>(val value: T) {
private var hasBeenSubscribed = false
fun getObservable(): Observable<T> =
if (hasBeenSubscribed) {
Observable.never<T>()
} else {
hasBeenSubscribed = true
Observable.just(value)
}
}
arekolek
09/19/2019, 3:43 PMif
is evaluated at assembly, not at subscription. So if you call getObservable()
once, all its subscribers will still get the valuearekolek
09/19/2019, 3:44 PMreline
09/19/2019, 3:49 PMfun <T> Observable<T>.toColdSingleSubscribeable(): Observable<T> {
return ColdObservableSingleSubscriberProxy(this)
}
class ColdObservableSingleSubscriberProxy<T>(private val observable: Observable<T>) : Observable<T>() {
private val hasBeenSubscribed = AtomicBoolean(false)
override fun subscribeActual(observer: Observer<in T>) {
if (hasBeenSubscribed.compareAndSet(false, true)) {
observable.subscribe(observer)
} else {
never<T>().subscribe(observer)
}
}
}
reline
09/19/2019, 3:57 PMfalse
for isDisposed
however, so use empty()
instead of never()
if you want it isDisposed
to return true immediately after subscribing.