Easily dispose RxJava streams with Android's Lifecycle
Checkout my Medium article.
dependencies {
// Non AndroidX projects
implementation 'io.sellmair:disposer:1.1.0'
// AndroidX projects rxjava2
implementation 'io.sellmair:disposer:2.0.0'
// AndroidX projects rxjava3
implementation 'io.sellmair:disposer:3.0.0'
}A Disposer is the object managing multiple Disposable instances and disposes them
at the correct time.
You can easily add a given disposable to a Disposer:
val disposer: Disposer = /* ... */
val disposable = Service.queryAwesomeData().subscribe()
disposer.add(disposable) // The disposable will now managed by the disposerOr a much sweeter apis, that might look familiar to rxKotlin users:
val disposer: Disposer = /* ... */
disposer += Service.queryAwesomeData().subscribe() // Managed by the disposerval disposer: Disposer = /* ... */
Service.queryAwesomeData().subscribe().disposeBy(disposer) // Managed by the disposerRxLifecycle makes it easy to get a disposer for each lifecycle hook like
onCreate, onStart, onResume, onPause, onStop and onDestroy
One can simple call the extension function:
val onStopDisposer: Disposer = lifecycle.disposers.onStopMuch more shorter and convenient extensions are also offered, like for LifecycleOwner:
class MyCoolComponent: LifecycleOwner {
// ...
private val onStopDisposer: Disposer = this.onStop
}Which leads to very concise and readable API's inside your Activity or Fragment classes:
class MyCoolFragment {
// awesome other code
fun onStart(){
super.onStart()
awesomDataProvider.query()
.flatMap(::pepareForAwesomeness)
.filter(::isAwesome)
.subscribe(::displayAwesomeData)
.disposeBy(onStop) // <--- Will automatically be disposed when onStop() is called.
}
}It is also possible to put the .disposeBy call before the .subscribe.
But be aware, that this will only dispose the upstream not the downstream, which is
often okay, but should only be used with caution!
awesomDataProvider.query()
.flatMap(::pepareForAwesomeness)
.filter(::isAwesome)
.disposeBy(onStop) // <--- Will dispose everything above it when .onStop() is called
.subscribe(::displayAwesomeData)You can easily create your own Disposer by calling
val disposer = Disposer.create()Each call of
disposer.dispose()Will dispose all currently managed disposables and reset the Disposer
CompositeDisposable and actually
is more like CompositeDisposable.clear.