【问题标题】:How to unsubscribe from Flowable in RxKotlin/RxJava?如何在 RxKotlin/RxJava 中取消订阅 Flowable?
【发布时间】:2018-08-03 07:44:25
【问题描述】:

this 文章之后,我正在使用带有 RxJava/RxKotlin Flowable 的 Room。我让它运行了,但是在 ViewPager 中使用 3 个片段时遇到了问题。

我会带你看一下我的代码:

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

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

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

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

我的代码是

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

【问题讨论】:

  • lambda-subscribe 会给你一个Disposable 回来。保留它并在onPause 中处理它。
  • @akarnokd 检查我上面的代码,这是在 Kotlin 中返回 Unit 数据类型

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    感谢您的回答。我找到了解决办法。通过将订阅保存在 FlowableSubscriber 的onSubscribe(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()
         }
    

    【讨论】:

      【解决方案3】:

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

      我看不到您的代码,但如果您无法访问该对象,您也可以将takeUntiltakeWhile 添加到您的Flowable(如果您不在视线范围内)。这有点像 hack,因为在发出下一个项目并调用 takeUntil 之前,它不会取消订阅源 observable。致电dispose 是最好的选择。

      【讨论】:

      • 感谢您的回答。我在上面添加了我的代码的 sn-p。我正在使用 Kotlin,此代码返回 Unit 数据类型而不是 Dispose。
      【解决方案4】:

      针对目前的情况:让你的订阅者扩展DisposableSubscriber,订阅like

      
      yourFlowable
        .subscribeWith(yourSubscriber)
        .addTo(compositeDisposable)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-19
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多