通常,我在“onStop/onDestroy”函数上调用“disposable.clear()”。
但是今天,我看到我的同事使用下面的代码在订阅函数中调用 clear 函数,例如:
val disposable: CompositeDisposable = CompositeDisposable()
...
disposable.add(
MyObservable()
.subscribeOn(ioScheduler)
.observeOn(uiScheduler)
.subscribe {
// doSomething...
disposable.clear // My question is here.
}
)
实际上,它看起来工作正常。但是我不知道这段代码是否正确...
最佳答案
在 Android 中使用 RxJava 时,我通常会在 onDestroy
中“处置”所有一次性用品。在 onDestroy
中处理它们是足够安全的,因为即使 onDestroy
从未被调用,您也可以安全地假设系统已经终止了您的应用程序进程或订阅了可观察。
我从不在 onSuccess
或 onNext
中处理订阅的原因是,例如,在 Flowable
的情况下...onNext
可以多次发出,处理订阅没有意义。
事实上,我通常做的是将 CompositeDisposable
包装在 LifecycleObserver
中,以便它可以根据生命周期感知组件自动进行垃圾收集。这是我经常使用的实现...
class AutoDisposable : LifecycleObserver{
lateinit var compositeDisposables: CompositeDisposable
/**
* Binds this observer to the specified life cycle object
*
* @param lifecycle The lifecycle object to bind to
*/
fun bindTo(lifecycle: Lifecycle){
lifecycle.addObserver(this)
compositeDisposables = CompositeDisposable()
}
/**
* Registers a disposable that will be disposed when the bound lifecycle object is destroyed
*
* @param disposable The disposable to register
*/
fun addDisposable(disposable: Disposable){
if(::compositeDisposables.isInitialized){
compositeDisposables.add(disposable)
}
else{
throw Exception("This object must be bound to a lifecycle before registering a disposable")
}
}
/**
* Disposes all registered disposables
*/
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(){
compositeDisposables.dispose()
}
}
然后在一个 Activity (或 fragment )上你所要做的就是......
class MyActivity : AppCompatActivity(){
private val autoDisposables: AutoDisposable =
AutoDisposable()
override fun onCreate(savedInstanceState: Bundle?) {
autoDisposables.bindTo(lifecycle)
}
override fun onStart(){
autoDisposables.add(
MyObservable()
.subscribeOn(ioScheduler)
.observeOn(uiScheduler)
.subscribe {
// handle onNext
}
)
}
}
那么您无需担心、清除或处置您的订阅。您甚至可以更进一步,创建一个基本 Activity 或 fragment ,负责绑定(bind) CompositeDisposable
并公开 protected
函数以添加一次性用品...
//on a base activity
protected fun registerDisposable(disposable: Disposable){
autoDisposables.addDisposable(disposable)
}
关于android - RxJava,在订阅中清除一次性是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57246068/