RxJava,在订阅中清除一次性是否正确?

yoo*_*hok 3 android kotlin rx-java

通常,我在“onStop/onDestroy”函数上调用“disposable.clear()”。

但是今天,我看到我的同事使用以下代码在 subscribe 函数中调用 clear 函数,例如:

val disposable: CompositeDisposable = CompositeDisposable()

...

disposable.add(
    MyObservable()
        .subscribeOn(ioScheduler)
        .observeOn(uiScheduler)
        .subscribe {

            // doSomething...

            disposable.clear // My question is here.
        }
)
Run Code Online (Sandbox Code Playgroud)

实际上,它看起来工作正常。但我不知道这段代码是否正确......

Leo*_*Leo 5

在 Android 中使用 RxJava 时,我通常在onDestroy. 处理它们是足够安全的,onDestroy因为即使onDestroy从未被调用,您也可以安全地假设系统已经杀死了您的应用程序进程或订阅了 Observable 的组件。

我从不处理订阅的原因onSuccessoronNext是因为例如,在Flowable...onNext可以多次发出的情况下,处理订阅是没有意义的。

事实上,我通常做的是将CompositeDisposablea包裹在里面,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()
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在一个活动(或片段)上你所要做的就是......

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
             }
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您无需担心、清除或处置您的订阅。您甚至可以更进一步,创建一个基础活动或片段,负责绑定CompositeDisposable和公开protected函数以添加一次性物品...

//on a base activity
protected fun registerDisposable(disposable: Disposable){
     autoDisposables.addDisposable(disposable)
}
Run Code Online (Sandbox Code Playgroud)