如何取消订阅RxKotlin / RxJava中的Flowable?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何取消订阅RxKotlin / RxJava中的Flowable?相关的知识,希望对你有一定的参考价值。

我正在使用带有RxJava / RxKotlin Flowable的房间,跟随this文章。我得到它运行,但有问题使用它与ViewPager 3片段。

我将向您介绍我的代码:

我有一个带有标签布局和三个片段(A,B和收藏夹)的viewpager。前两个片段包含可添加到收藏夹的数据列表。

在最喜欢的片段中,我使用Flowable来监听A和B所做的更改并相应地更新列表。但是当一个项目在A和B中成为最喜欢的时候会发生什么,应用程序崩溃,因为即使片段不在前台,最喜欢的片段中的Flowable订阅也会运行。

我想要的是当片段不在前台并从前台开始时能够停止订阅。

我试图在喜欢的片段的onPause方法中停止它,但flowable没有取消订阅或处置方法。

我的代码是

dbRepository?.getAllImportant()?.subscribeOn(Schedulers.io())
            ?.observeOn(androidSchedulers.mainThread())
            ?.subscribe(getFlowableSubscriber())
答案

当您订阅Flowable时,它会返回一个Dispose对象。如果您打电话给dispose(),您将取消订阅一次性用品。

我无法看到您的代码,但如果您无法访问该对象,您还可以在takeUntil中添加takeWhileFlowable,如果您不在视线范围内。这有点像黑客,因为在发出下一个项目并调用takeUntil之前,它不会取消订阅源可观察对象。打电话给dispose是最好的选择。

另一答案

您应该在compositeDisposable()中包含Flowable,并在需要取消订阅时使用composite.dipose()。

CompositeDisposable composite = new CompositeDisposable();

composite.add(dbRepository?.getAllImportant()?.subscribeOn(Schedulers.io())
        ?.observeOn(AndroidSchedulers.mainThread())
        ?.subscribe(getFlowableSubscriber())

然后当你想要取消订阅时:

composite.dispose();

通常,您应该在onDestroy或onPause方法中取消订阅Flowable。

另一答案

谢谢你的回答。我找到了一个解决方法。通过将订阅保存在FlowableSubscriber的onSubscribe(subscription: Subscription)函数中。后来在subscription.cancel打电话给onStop()

        override fun onSubscribe(subscription: Subscription) {
            log("onSubscribe")
            this@ImportantFragment.subscription = subscription
        }

    override fun onStop() {
           log("onStop() ")
           this.subscription.cancel()
           super.onStop()
     }

以上是关于如何取消订阅RxKotlin / RxJava中的Flowable?的主要内容,如果未能解决你的问题,请参考以下文章

使用 RxJava、RxKotlin 或 Even Kotlin 协程代替 On Click 监听器的接口有啥好处?

RxJava Subscription 自动取消订阅

RxJava2 中多种取消订阅 dispose 的方法梳理( 源码分析 )

对比Java学Kotlin协程-异步流

对比Java学Kotlin协程-异步流

对比Java学Kotlin协程-异步流