使用 RxJava 这个库做开发也已经很多年了,从刚开始使用到现在也经历了很多个阶段,中间也遇到了很多问题,今天我们就 RxJava 的生命周期问题好好聊一聊。
Observable.create {
// do something
it.onNext("")
it.onComplete()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
// onNext
}, {
// onError
})
那么,如何对 RxJava 的生命周期进行管理呢?RxJava 给我们提供了
CompositeDisposable
这个类,用于对 RxJava 的管理。
val disposable = Observable.create {
// do something
it.onNext("")
it.onComplete()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
// onNext
}, {
// onError
})
val disposables = CompositeDisposable()
disposables.add(disposable)
disposables.clear()
Disposable
对象添加到 CompositeDisposable
对象中,并在每个界面结束的时候,调用 CompositeDisposable
对象的 clear()
方法取消事件。subscribe
方法的返回参数进行处理,studio
就会报黄色的警告,这是因为 RxJava 在 subscribe
方法添加了 @CheckReturnValue
注解,要求我们对其返回值进行处理。这就是我第一阶段的处理,在每次使用到 RxJava 的时候,添加
CompositeDisposable
,并在Activity
的onDestroy
方法中进行处理。
从上面的处理引申出来,无非是将相关操作封装到基类中,提供一个方法
addDisposable
来将 RxJava 请求添加到生命周期管理。
后来使用了 Google Jetpack 中的ViewModel
,就将最后的清理操作放到了ViewModel
的onCleared
方法中。
addDisposable(
Observable.create {
// do something
it.onNext("")
it.onComplete()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
// onNext
}, {
// onError
})
)
val disposable = Observable.create {
// do something
it.onNext("")
it.onComplete()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
// onNext
}, {
// onError
})
addDisposable(disposable)
addDisposable
,一次两次没什么,但如果项目中用的多了,就会觉得很繁琐,所以,我产生对其进行优化的念头。interface RxLifecycleOwner {
/** RxJ 生命周期管理 */
var disposables: CompositeDisposable?
/**
* 将 Rx 添加到生命周期管理
*/
fun addDisposable(dis: Disposable) {
disposables?.add(dis)
}
/**
* 处理所有添加到生命周期管理的事件
*/
fun disposeAll() {
disposables?.clear()
disposables = null
}
}
/**
* 订阅并关联生命周期管理
*
* @param owner Rx 生命周期管理接口
* @param onNext 事件处理
* @param onComplete 事件完成
* @param onSubscribe 事件订阅
*
* @return [Disposable] 事件对象
*/
fun Observable.subscribeWithOwner(owner: RxLifecycleOwner,
onNext: Consumer = Functions.emptyConsumer(),
onError: Consumer = Functions.ON_ERROR_MISSING,
onComplete: Action = Functions.EMPTY_ACTION,
onSubscribe: Consumer = Functions.emptyConsumer()
): Disposable {
val disposable = this.subscribe(onNext, onError, onComplete, onSubscribe)
owner.addDisposable(disposable)
return disposable
}
/**
* 订阅并关联生命周期管理
*
* @param owner Rx 生命周期管理接口
* @param observer 观察者对象
*/
fun Observable.subscribeWithOwner(owner: RxLifecycleOwner,
observer: Observer
) {
this.subscribe(object : Observer {
override fun onComplete() {
observer.onComplete()
}
override fun onSubscribe(d: Disposable) {
observer.onSubscribe(d)
owner.addDisposable(d)
}
override fun onNext(t: T) {
observer.onNext(t)
}
override fun onError(e: Throwable) {
observer.onError(e)
}
})
}
RxLifecycleOwner
接口,并初始化CompositeDisposable
对象就可以了。class BaseViewModel
: ViewModel(), RxLifeCycleOwner {
/** Rx 生命周期管理 */
override var disposables: CompositeDisposable? = CompositeDisposable()
override fun onCleared() {
// 处理 Rx 事件
disposeAll()
}
}
class MainViewModel : BaseViewModel() {
fun doSomething() {
Observable.create {
// do something
it.onNext("")
it.onComplete()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWithOwner(this, {
// onNext
}, {
// onError
})
}
}
经过上面的一通操作,我们已经对 RxJava 的生命周期管理进行了一定的简化,但是还是觉得复杂怎么办,为什么每次使用都要实现
RxLifecycleOwner
接口啊,每次都要手动去取消事件,好麻烦的样子,有没有更好的解决方案?
这时,LiveData
给了我灵感。
LiveData
是有生命周期感知的,他内部有一个 LifecycleBoundObserver
类,通过实现 LifecycleEventObserver
接口实现了对 Activity、Fragment 的生命周期感知,LifecycleEventObserver
中有 onStateChanged
方法,会在Activity、Fragment 生命周期方法后回调,于是,就有了接下来的操作。/**
* Rx 生命周期观察者
*
* @param lifecycleOwner Android 生命周期管理接口
*/
class RxLifecycleObserver(lifecycleOwner: LifecycleOwner) : LifecycleEventObserver, RxLifecycleOwner {
override var disposables: CompositeDisposable? = null
init {
disposables = CompositeDisposable()
// 将当前观察者对象添加到 Android 生命周期管理
lifecycleOwner.lifecycle.addObserver(this)
}
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (source.lifecycle.currentState == Lifecycle.State.DESTROYED) {
// 生命周期走到了 onDestroy,消费所有事件
disposeAll()
// 移除观察者
source.lifecycle.removeObserver(this)
// 从集合中移除引用
rxLifecycles.remove(source)
}
}
}
LifecycleOwner
,但有需要生命周期管理,所以保留了 RxLifecycleOwner
接口。/**
* HashMap 对象,保存 Rx、Android 生命周期管理对象
*/
internal val rxLifecycles = hashMapOf()
/**
* 根据 Android 生命周期对象获取 Rx 生命周期管理对象
*
* @param owner Android 生命周期对象
*
* @return Rx 生命周期管理对象
*/
internal fun getObserver(owner: LifecycleOwner): RxLifecycleObserver {
var observer: RxLifecycleObserver?
if (rxLifecycles.containsKey(owner)) {
// 集合中已包含观察者对象
observer = rxLifecycles[owner]
if (observer != null) {
// 且不为空,返回已有的观察者对象
return observer
}
}
// 没有已存在的,新建观察者对象
observer = RxLifecycleObserver(owner)
// 添加到 Map 集合以复用
rxLifecycles[owner] = observer
return observer
}
/**
* 订阅并关联生命周期管理
*
* @param owner Android 生命周期接口
* @param onNext 事件处理
* @param onComplete 事件完成
* @param onSubscribe 事件订阅
*
* @return [Disposable] 事件对象
*/
fun Observable.subscribeWithOwner(owner: LifecycleOwner,
onNext: Consumer = Functions.emptyConsumer(),
onError: Consumer = Functions.ON_ERROR_MISSING,
onComplete: Action = Functions.EMPTY_ACTION,
onSubscribe: Consumer = Functions.emptyConsumer()
): Disposable {
val disposable = this.subscribe(onNext, onError, onComplete, onSubscribe)
getObserver(owner).addDisposable(disposable)
return disposable
}
/**
* 订阅并关联生命周期管理
*
* @param owner Android 生命周期接口
* @param observer 观察者对象
*/
fun Observable.subscribeWithOwner(owner: LifecycleOwner,
observer: Observer
) {
this.subscribe(object : Observer {
override fun onComplete() {
observer.onComplete()
}
override fun onSubscribe(d: Disposable) {
observer.onSubscribe(d)
getObserver(owner).addDisposable(d)
}
override fun onNext(t: T) {
observer.onNext(t)
}
override fun onError(e: Throwable) {
observer.onError(e)
}
})
}
class MainActivity : AppCompatActivity() {
fun doSomething() {
Observable.create {
// do something
it.onNext("")
it.onComplete()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWithOwner(this, {
// onNext
}, {
// onError
})
}
}
class BaseViewModel : ViewModel(), LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_CREATE -> onCreate(source)
Lifecycle.Event.ON_START -> onStart(source)
Lifecycle.Event.ON_RESUME -> onResume(source)
Lifecycle.Event.ON_PAUSE -> onPause(source)
Lifecycle.Event.ON_STOP -> onStop(source)
Lifecycle.Event.ON_DESTROY -> onDestroy(source)
Lifecycle.Event.ON_ANY -> {
}
}
}
}
class MainViewModel : BaseViewModel() {
override fun onCreate(source: LifecycleOwner) {
Observable.create {
// do something
it.onNext("")
it.onComplete()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWithOwner(source, {
// onNext
}, {
// onError
})
}
}