如何取消订阅RxKotlin / RxJava中的Flowable?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何取消订阅RxKotlin / RxJava中的Flowable?相关的知识,希望对你有一定的参考价值。
我正在使用带有RxJava / RxKotlin Flowable的房间,跟随this文章。我得到它运行,但有问题使用它与ViewPager 3片段。
我将向您介绍我的代码:
我有一个带有标签布局和三个片段(A,B和收藏夹)的viewpager。前两个片段包含可添加到收藏夹的数据列表。
在最喜欢的片段中,我使用Flowable来监听A和B所做的更改并相应地更新列表。但是当一个项目在A和B中成为最喜欢的时候会发生什么,应用程序崩溃,因为即使片段不在前台,最喜欢的片段中的Flowable订阅也会运行。
我想要的是当片段不在前台并从前台开始时能够停止订阅。
我试图在喜欢的片段的onPause方法中停止它,但flowable没有取消订阅或处置方法。
我的代码是
dbRepository?.getAllImportant()?.subscribeOn(Schedulers.io())
?.observeOn(androidSchedulers.mainThread())
?.subscribe(getFlowableSubscriber())
当您订阅Flowable
时,它会返回一个Dispose
对象。如果您打电话给dispose()
,您将取消订阅一次性用品。
我无法看到您的代码,但如果您无法访问该对象,您还可以在takeUntil
中添加takeWhile
或Flowable
,如果您不在视线范围内。这有点像黑客,因为在发出下一个项目并调用takeUntil
之前,它不会取消订阅源可观察对象。打电话给dispose
是最好的选择。
您应该在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。
谢谢你的回答。我找到了一个解决方法。通过将订阅保存在FlowableSubscriber的onSubscribe(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()
}
以上是关于如何取消订阅RxKotlin / RxJava中的Flowable?的主要内容,如果未能解决你的问题,请参考以下文章
使用 RxJava、RxKotlin 或 Even Kotlin 协程代替 On Click 监听器的接口有啥好处?