如何在RxKotlin / RxJava中退订Flowable?

时间:2018-08-03 07:44:26

标签: android-fragments rx-java rx-java2 rx-android rx-kotlin2

this下,我正在将Room与RxJava / RxKotlin Flowable一起使用。我运行了它,但将它与3个片段的ViewPager一起使用时遇到了问题。

我将带您逐步了解我的代码:

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

在最喜欢的片段中,我使用Flowable来监听A和B所做的更改并相应地更新列表。但是发生的是,当某个项目在A和B中成为收藏夹时,由于即使收藏夹片段中的Flowable订阅仍在运行,即使该片段不在前台,应用也会崩溃。

我想要的是能够在片段不在前台时停止订阅并在前台启动。

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

我的代码是

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

4 个答案:

答案 0 :(得分:0)

当您订阅Flowable时,它将返回一个Dispose对象。如果您致电dispose(),则将退订一次性用品。

我看不到您的代码,但是如果您无法访问该对象,那么如果您看不见该对象,也可以在您的takeUntil上添加一个takeWhileFlowable 。不过,这有点骇人听闻,因为直到发出下一项并调用takeUntil时,它才可以从源中取消订阅。呼叫dispose是最好的选择。

答案 1 :(得分:0)

谢谢您的回答。我找到了解决方法。通过在FlowableSubscriber的onSubscribe(subscription: 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()
     }

答案 2 :(得分:0)

您应该将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。

答案 3 :(得分:0)

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


yourFlowable
  .subscribeWith(yourSubscriber)
  .addTo(compositeDisposable)