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

Android fragments 如何在RxKotlin/RxJava中取消订阅Flowable?,android-fragments,rx-java,rx-java2,rx-android,rx-kotlin2,Android Fragments,Rx Java,Rx Java2,Rx Android,Rx Kotlin2,我正在使用Room和RxJava/RxKotlin Flowable,下面是一篇文章。我让它运行,但问题是使用它的ViewPager有3个片段 我将向您介绍我的代码: 我有一个带有选项卡布局和三个片段(a、B和收藏夹)的viewpager。前两个片段包含可以添加到收藏夹的数据列表 在favorite片段中,我使用Flowable来监听A和B所做的更改,并相应地更新列表。但当一个项目在A和B中成为收藏夹时,应用程序会崩溃,因为即使该片段不在前台,收藏夹片段中的可流动订阅也会运行 我想要的是能够在片

我正在使用Room和RxJava/RxKotlin Flowable,下面是一篇文章。我让它运行,但问题是使用它的ViewPager有3个片段

我将向您介绍我的代码:

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

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

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

我试图用最喜欢片段的onPause方法阻止它,但flowable并没有取消订阅或处置方法

我的代码是

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

当您订阅一个
Flowable
时,它将返回一个
Dispose
对象。如果您在这个问题上调用
dispose()
,您将从一次性服务中取消订阅


我看不到您的代码,但如果您无法访问该对象,您也可以在您的
可流动
中添加
takeUntil
takeWhile
。不过这有点像黑客,因为在发出下一个项目并调用
takeUntil
之前,它不会从可观察的源取消订阅。调用
dispose
是最好的选择。

当您订阅一个
Flowable
时,它会返回一个
dispose
对象。如果您在这个问题上调用
dispose()
,您将从一次性服务中取消订阅


我看不到您的代码,但如果您无法访问该对象,您也可以在您的
可流动
中添加
takeUntil
takeWhile
。不过这有点像黑客,因为在发出下一个项目并调用
takeUntil
之前,它不会从可观察的源取消订阅。打电话给dispose是最好的选择。

谢谢您的回答。我找到了一份工作。通过在FlowableSubscriber的
onSubscribe(Subscription:Subscription)
功能中保存订阅。然后在
onStop()中调用
subscription.cancel


谢谢你的回答。我找到了一份工作。通过在FlowableSubscriber的
onSubscribe(Subscription:Subscription)
功能中保存订阅。然后在
onStop()中调用
subscription.cancel


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

CompositeDisposable composite = new CompositeDisposable();

composite.add(dbRepository?.getAllImportant()?.subscribeOn(Schedulers.io())
        ?.observeOn(AndroidSchedulers.mainThread())
        ?.subscribe(getFlowableSubscriber())
然后,当您想要取消订阅时:

composite.dispose();

通常,您应该在onDestroy或onPause方法中取消订阅可流动内容。

您应该在compositeDisposable()中包含可流动内容,并在需要取消订阅时使用composite.dipose()

CompositeDisposable composite = new CompositeDisposable();

composite.add(dbRepository?.getAllImportant()?.subscribeOn(Schedulers.io())
        ?.observeOn(AndroidSchedulers.mainThread())
        ?.subscribe(getFlowableSubscriber())
然后,当您想要取消订阅时:

composite.dispose();

通常情况下,您应该使用onDestroy或onPause方法取消订阅Flowable。

lambda-
subscribe
将为您返回一个
一次性
。例如,将其保留在
onPause
中,并在
onPause中进行处理。@akarnokd检查上面的代码,这将返回一个单位数据类型,单位数据类型为kotlin,lambda-
subscribe
将返回一个
一次性
。例如,将其保留在
onPause
中并将其处理。@akarnokd检查上面的我的代码,这是在Kotlin中返回一个单位数据类型,谢谢回答。我在上面添加了一段代码。我正在使用Kotlin,这段代码返回的是单位数据类型not Dispose。谢谢您的回答。我在上面添加了一段代码。我正在使用Kotlin,这段代码返回Unit数据类型not Dispose。