在this下,我正在将Room与RxJava / RxKotlin Flowable一起使用。我运行了它,但将它与3个片段的ViewPager一起使用时遇到了问题。
我将带您逐步了解我的代码:
我有一个带有选项卡布局和三个片段(A,B和收藏夹)的viewpager。前两个片段包含可以添加到收藏夹的数据列表。
在最喜欢的片段中,我使用Flowable来监听A和B所做的更改并相应地更新列表。但是发生的是,当某个项目在A和B中成为收藏夹时,由于即使收藏夹片段中的Flowable订阅仍在运行,即使该片段不在前台,应用也会崩溃。
我想要的是能够在片段不在前台时停止订阅并在前台启动。
我试图用喜欢的片段的onPause方法停止它,但是flowable没有取消订阅或处理方法。
我的代码是
dbRepository?.getAllImportant()?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(getFlowableSubscriber())
答案 0 :(得分:0)
当您订阅Flowable
时,它将返回一个Dispose
对象。如果您致电dispose()
,则将退订一次性用品。
我看不到您的代码,但是如果您无法访问该对象,那么如果您看不见该对象,也可以在您的takeUntil
上添加一个takeWhile
或Flowable
。不过,这有点骇人听闻,因为直到发出下一项并调用takeUntil
时,它才可以从源中取消订阅。呼叫dispose
是最好的选择。
答案 1 :(得分:0)
谢谢您的回答。我找到了解决方法。通过在FlowableSubscriber的onSubscribe(subscription: 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()
}
答案 2 :(得分:0)
您应该将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。
答案 3 :(得分:0)
对于目前的情况:让您的订阅者延长DisposableSubscriber,然后订阅
yourFlowable
.subscribeWith(yourSubscriber)
.addTo(compositeDisposable)