Skip to content

Instantly share code, notes, and snippets.

@sebastienrouif
Created April 5, 2019 09:16
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sebastienrouif/fb3171d7e638a6f83621769d4ebd88f3 to your computer and use it in GitHub Desktop.
Save sebastienrouif/fb3171d7e638a6f83621769d4ebd88f3 to your computer and use it in GitHub Desktop.
Usage of share operator with an observable. Relevant for any resource that is costly and should only "work" when at least one Observable is subscribed. eg.Location in Android
fun main() {
var counter = 0
var emitter: ObservableEmitter<Int>? = null
val subject = Observable.create<Int> {
println("emitter creation")
emitter = it
it.setCancellable {
counter = 0
println("cancelling emitter $it")
}
}
.doOnSubscribe { println("subject doOnSubscribe $it") }
.doOnEach { println("subject doOnEach $it") }
.doOnDispose { println("subject doOnDispose") }
.doOnComplete { println("subject doOnComplete") }
.doOnError { println("subject doOnError") }
val shared = subject.share()
.doOnSubscribe { println("shared doOnSubscribe $it") }
.doOnEach { println("shared doOnEach $it") }
.doOnDispose { println("shared doOnDispose") }
.doOnComplete { println("shared doOnComplete") }
.doOnError { println("shared doOnError") }
println("\n=disposable1 creation=")
val disposable1: Disposable = shared.subscribe(
{ println("disposable1 onNext $it ") },
{ println("disposable1 error $it ") },
{ println("disposable1 complete ") }
)
println("\n=====[1]=====")
emitter!!.onNext(++counter)
println("\n=disposable2 creation=")
val disposable2: Disposable = shared.subscribe(
{ println("disposable2 onNext $it ") },
{ println("disposable2 error $it ") },
{ println("disposable2 complete ") }
)
println("\n=====[2]=====")
emitter!!.onNext(++counter)
println("\n=disposable1 dispose=")
disposable1.dispose()
println("\n=====[3]=====")
emitter!!.onNext(++counter)
println("\n=disposable1 dispose=")
disposable2.dispose()
println("\n=disposable3 creation=")
val disposable3: Disposable = shared.subscribe(
{ println("disposable3 onNext $it ") },
{ println("disposable3 error $it") },
{ println("disposable3 complete") }
)
println("\n=====[1]=====")
emitter!!.onNext(++counter)
println("\n=disposable3 dispose=")
disposable3.dispose()
emitter!!.onNext(++counter)
}
@sebastienrouif
Copy link
Author

shared doOnSubscribe false
subject doOnSubscribe CreateEmitter{null}
emitter creation

=====[1]=====
subject doOnEach OnNextNotification[1]
shared doOnEach OnNextNotification[1]
disposable1 onNext 1 

=disposable2 creation=
shared doOnSubscribe false

=====[2]=====
subject doOnEach OnNextNotification[2]
shared doOnEach OnNextNotification[2]
disposable1 onNext 2 
shared doOnEach OnNextNotification[2]
disposable2 onNext 2 

=disposable1 dispose=
shared doOnDispose

=====[3]=====
subject doOnEach OnNextNotification[3]
shared doOnEach OnNextNotification[3]
disposable2 onNext 3 

=disposable1 dispose=
shared doOnDispose
subject doOnDispose
cancelling emitter CreateEmitter{DISPOSED}

=disposable3 creation=
shared doOnSubscribe false
subject doOnSubscribe CreateEmitter{null}
emitter creation

=====[1]=====
subject doOnEach OnNextNotification[1]
shared doOnEach OnNextNotification[1]
disposable3 onNext 1 

=disposable3 dispose=
shared doOnDispose
subject doOnDispose
cancelling emitter CreateEmitter{DISPOSED}```

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment