0

在这篇文章之后,我正在使用带有 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())
4

4 回答 4

2

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

于 2018-09-11T10:27:47.217 回答
1

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

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

    override fun onStop() {
           log("onStop() ")
           this.subscription.cancel()
           super.onStop()
     }
于 2018-08-03T10:53:32.777 回答
0

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

我看不到您的代码,但如果您无法访问该对象,您也可以在看不见的情况下添加takeUntil或。不过,这有点 hack,因为它不会取消订阅源 observable,直到下一个项目被发出并被调用。打电话是最好的选择。takeWhileFlowabletakeUntildispose

于 2018-08-03T10:06:09.447 回答
0

对于当前情况:让您的订阅者扩展DisposableSubscriber,并像订阅一样订阅


yourFlowable
  .subscribeWith(yourSubscriber)
  .addTo(compositeDisposable)
于 2021-06-17T14:10:13.157 回答