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

标签 android kotlin rx-java

通常,我在“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 从未被调用,您也可以安全地假设系统已经终止了您的应用程序进程或订阅了可观察。

我从不在 onSuccessonNext 中处理订阅的原因是,例如,在 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/

相关文章:

java - 多次订阅 RxJava observable

java - 运行Java应用程序以在tomcat服务器上运行

android - 如何识别 sdk 级别低于 android.os.Build.VERSION_CODES.LOLLIPOP_MR1 的双卡运营商名称

android - 为什么 Android Studio 不会在 Release模式下创建我的 AAR 文件

android - 如何将数据类解析为 Kotlin 的 JSON 字符串?

java - 如何让 OkHttpClient 遵守 REST API 速率限制?

android - 在 Kotlin 中是否有更干净的方法来设置日期时间

android - 使用 Retrofit 搜索 api

java - 在 Couchbase Java SDK 中使用 toBlocking() 的正确方法是什么?

android - 我在哪里可以获得Android相机应用程序源代码?