RxKotlin/RxJava如何退订Flowable?

How to unsubscribe from Flowable in RxKotlin/RxJava?

我正在使用 Room with 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 时,它 returns 一个 Dispose 对象。如果你在上面调用 dispose(),你将取消订阅一次性订阅。

我看不到你的代码,但如果你无法访问该对象,你也可以在 Flowable 中添加 takeUntiltakeWhile 如果你不在看法。不过这有点 hack,因为它不会取消订阅可观察到的源,直到发出下一个项目并调用 takeUntil 。调用 dispose 是最好的选择。

感谢您的解答。我找到了解决方法。通过在 FlowableSubscriber 的 onSubscribe(subscription: Subscription) 函数中保存 Subscription。然后在 onStop()

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

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

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

CompositeDisposable composite = new CompositeDisposable();

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

然后当你想取消订阅时:

composite.dispose();

一般情况下,您应该在onDestroy或onPause方法中取消订阅Flowable。

对于目前的情况:让您的订阅者延长DisposableSubscriber,并订阅


yourFlowable
  .subscribeWith(yourSubscriber)
  .addTo(compositeDisposable)