当前位置: 首页 > 知识库问答 >
问题:

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

曹茂材
2023-03-14

在这篇文章之后,我正在使用带有RxJava/RxKotlin Flowable的Room。我让它运行,但在带有3个片段的ViewPager中使用它存在问题。

我将向您介绍我的代码:

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

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

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

我试图在收藏夹片段的onPause方法中阻止它,但flowable没有取消订阅或处置方法。

我的代码是

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

共有3个答案

金嘉言
2023-03-14

订阅可流动对象时,它会返回一个Dispose对象。如果您在此调用dispose(),您将从disposable中取消订阅。

我看不到您的代码,但如果您无法访问该对象,您还可以在您的Flowable中添加获取直到获取同时如果您不在视野中。不过,这有点像黑客,因为它不会取消订阅源可观察,直到发出下一个项目并调用获取直到。调用dispose是最好的选择。

常海
2023-03-14

谢谢你的回答。我找到了一个解决方法。通过在FlowableSubscriber的onSubscribe(订阅:订阅)函数中保存订阅。然后在onStop()中调用subscription.cancel

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

    override fun onStop() {
           log("onStop() ")
           this.subscription.cancel()
           super.onStop()
     }
陆甫
2023-03-14

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

CompositeDisposable composite = new CompositeDisposable();

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

然后当您想取消订阅时:

composite.dispose();

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

 类似资料:
  • 例: 注意:是非Android 运行环境, 使用的是RxJava2.x

  • 我是RxJava的新手。我有一个,用于下载图像URL列表并将其转换为位图的简单网络操作。 在活动的上,我取消订阅可观察到的以避免内存泄漏。 我能看到的是,如果我在图像下载过程中退出活动,后台任务也会被终止。我只想继续做背景工作,即使我已经取消了《观察家》的订阅。有可能吗?

  • 问题内容: 在该程序包下,您有诸如和之类的类,我想可以将其描述为一些可用的示例。 这些主题如何退订?没有方法,并且调用完全结束了Observable,对吗? 问题答案: 同时是an 和an ,可以像普通可观察对象一样取消订阅。使主题特别之处在于它是可观察者和观察者之间的桥梁。它可以通过释放观测到的项目,也可以发射新的项目。就像对期货的承诺一样,主体是可观察的对象。 这是主题科的简短说明: Asyn

  • 我使用SockJS和StompJS,当我在浏览器中打开我的应用程序时,有时它会在连接到websocket之前尝试订阅一些主题。我希望主题订阅等待应用程序连接到websocket。 这就是我实现此代码的原因,我将其称为: 因此,我只在连接状态为时才订阅该主题,并且只有在客户端首次成功连接时才会调用该主题。 我想稍后从主题中取消订阅,所以我需要内部订阅返回的对象,我还需要内部订阅的消息。 我所实现的很

  • 我通读了RxJS文档,并希望确保我理解了< code > subscriber . unsubscribe()和< code > subscriber . complete()之间的区别。 假设我有一个有两个订阅者的可观察对象,订阅者1和订阅者2。如果订阅者1对其订阅调用取消订阅,它将不再接收来自可观察对象的通知,但订阅者2将继续接收它们。 <代码>的文档。complete(): 观察者回调,用于

  • 我知道当您订阅可观察时,您会收到一个必须使用Android生命周期取消订阅的订阅。因此,对于片段或活动中的订阅,我使用onDestroy()中的取消订阅。 但我的问题是,当我在没有任何生命周期的地方订阅时。例如,在SyncAdapter中。在这种情况下,我如何“自动取消订阅”以避免内存泄漏?在SyncAdapter中,有没有什么好的做法,比如说“永远不要在XXX位置订阅”,而我正在打破这种订阅?