RxKotlin/RxJava如何退订Flowable?
How to unsubscribe from Flowable in RxKotlin/RxJava?
我正在使用 Room with 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
时,它 returns 一个 Dispose
对象。如果你在上面调用 dispose()
,你将取消订阅一次性订阅。
我看不到你的代码,但如果你无法访问该对象,你也可以在 Flowable
中添加 takeUntil
或 takeWhile
如果你不在看法。不过这有点 hack,因为它不会取消订阅可观察到的源,直到发出下一个项目并调用 takeUntil
。调用 dispose
是最好的选择。
感谢您的解答。我找到了解决方法。通过在 FlowableSubscriber 的 onSubscribe(subscription: 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()
}
您应该将 Flowable 包含在 compositeDisposable() 中,并在您想要取消订阅时使用 composite.dipose()。
CompositeDisposable composite = new CompositeDisposable();
composite.add(dbRepository?.getAllImportant()?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(getFlowableSubscriber())
然后当你想取消订阅时:
composite.dispose();
一般情况下,您应该在onDestroy或onPause方法中取消订阅Flowable。
对于目前的情况:让您的订阅者延长DisposableSubscriber,并订阅
yourFlowable
.subscribeWith(yourSubscriber)
.addTo(compositeDisposable)
我正在使用 Room with 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
时,它 returns 一个 Dispose
对象。如果你在上面调用 dispose()
,你将取消订阅一次性订阅。
我看不到你的代码,但如果你无法访问该对象,你也可以在 Flowable
中添加 takeUntil
或 takeWhile
如果你不在看法。不过这有点 hack,因为它不会取消订阅可观察到的源,直到发出下一个项目并调用 takeUntil
。调用 dispose
是最好的选择。
感谢您的解答。我找到了解决方法。通过在 FlowableSubscriber 的 onSubscribe(subscription: 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()
}
您应该将 Flowable 包含在 compositeDisposable() 中,并在您想要取消订阅时使用 composite.dipose()。
CompositeDisposable composite = new CompositeDisposable();
composite.add(dbRepository?.getAllImportant()?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(getFlowableSubscriber())
然后当你想取消订阅时:
composite.dispose();
一般情况下,您应该在onDestroy或onPause方法中取消订阅Flowable。
对于目前的情况:让您的订阅者延长DisposableSubscriber,并订阅
yourFlowable
.subscribeWith(yourSubscriber)
.addTo(compositeDisposable)