Android RxJava在RecyclerView适配器演示器中取消订阅
我有一个为Android RxJava在RecyclerView适配器演示器中取消订阅,android,rx-java,mvp,rx-java2,Android,Rx Java,Mvp,Rx Java2,我有一个为RecyclerView.Adapter创建的演示者。演示者有一个方法来调用API层,然后更改一些本地数据值。这是作为Rx链实施的: public void doStuff(Object args) { mRemote.doStuff(args) .doOnNext(count -> mLocal.setStuffCount(count)) .firstOrError() .subscribeOn(m
RecyclerView.Adapter
创建的演示者。演示者有一个方法来调用API层,然后更改一些本地数据值。这是作为Rx链实施的:
public void doStuff(Object args) {
mRemote.doStuff(args)
.doOnNext(count -> mLocal.setStuffCount(count))
.firstOrError()
.subscribeOn(mSchedulerProvider.io())
.observeOn(mSchedulerProvider.ui())
.subscribe(...)
<...>
public void doStuff(对象参数){
mRemote.doStuff(args)
.doOnNext(计数->本地设置计数(计数))
.firstOrError()
.subscribeOn(mSchedulerProvider.io())
.observeOn(mSchedulerProvider.ui())
.订阅(…)
此方法可能会使用不同的参数多次调用,因此会生成不同的订阅。据我所知,RxJava将取消订阅onComplete
或onError
。但是,例如,可能创建了5个订阅,在解决它们之前,用户将从fragm继续因此,适配器
不再相关,应该收集。但是,据我所知,在解决这些问题之前,由于活动订阅的原因,不会收集该适配器
通常情况下,我会将演示者与相关视图链接,然后将所有订阅存储在一个CompositeDisposable
中,并在生命周期建议清除时清除一次性订阅(例如,视图变为onPause
状态)。我可以在此处实施类似的方法,但这意味着我必须:
1) 在视图和适配器之间建立关系,以便在触发视图的生命周期方法时,它将获取适配器并对其调用取消订阅方法,然后该方法将获取演示者并调用clear()
。我可以依靠回收服务视图中的OnAttachedFromRecyclerView
吗?还是必须手动完成
2) 每次调用我的presenter方法来完成任务时,我都会创建一个新订阅,这意味着CompositeDisposable
的大小将不断增大,直到谁知道是什么。尽管调用已执行,但可丢弃的仍会在CompositeDisposable
中引用
我觉得这里有一个更简单的解决方案,所以希望有人能告诉我
编辑:
我想到的另一个解决方案是,为每个
视图持有者创建一个演示者,并将订阅链接到持有者的绑定和回收。然而,这意味着要让更多的演示者留在周围,但这种方法似乎有点干净。不确定这是否对任何人都有用,但这就是我的看法他解决了这个问题
我最终合并了我的演示者
,同时为视图持有者
和片段
保留了不同的视图
界面(将它们称为视图持有者视图
和片段视图
)
我喜欢为每个ViewHolderView
设置一个Presenter
的想法,但是,这并没有真正解决我的问题。我在Presenter
中保留了我的CompositeDisposable
,但是通过这种方法,我不得不将它移到适配器
级别,并保留对一次性的引用de>在我的视图支架内
。与建议的答案类似
我不喜欢手动操作片段生命周期中的适配器,因为我已经在调用subscribe()
和unsubscribe()FragmentView
上的
,并且除非在RecyclerView上取消适配器,否则不会调用来自RecyclerView的
解决方案是将我的适配器
演示者与我的片段
演示者合并,同时保留ViewHolderView
界面。因此,我最终得到了一个演示者
和两个独立的视图
界面的合同,我将演示者
传递给适配器
de>FragmentView
取消订阅,它会清除所有内容。不确定这是否对任何人有用,但这就是我解决此问题的方法
我最终合并了我的演示者
,同时为视图持有者
和片段
保留了不同的视图
界面(将它们称为视图持有者视图
和片段视图
)
我喜欢为每个ViewHolderView
设置一个Presenter
的想法,但是,这并没有真正解决我的问题。我在Presenter
中保留了我的CompositeDisposable
,但是通过这种方法,我不得不将它移到适配器
级别,并保留对一次性的引用de>在我的视图支架内
。与建议的答案类似
我不喜欢手动操作片段生命周期中的适配器,因为我已经在调用subscribe()
和unsubscribe()FragmentView
上的
,并且除非在RecyclerView上取消适配器,否则不会调用来自RecyclerView的
解决方案是将我的适配器
演示者与我的片段
演示者合并,同时保留ViewHolderView
界面。因此,我最终得到了一个演示者
和两个独立的视图
界面的合同,我将演示者
传递给适配器
de>FragmentView
取消订阅,它会清理所有东西。那么可观察的东西就在你的演示者中?你的演示者中难道没有至少基本的生命周期事件吗?是的,Rx链和CompositeDisposable
在我的演示者中。是的,演示者
故意与生命周期无关。我的意思是,我可以在其中添加方法,我可以l调用生命周期事件,但是在适配器中使用哪些生命周期事件
?无论如何,看看我自己的答案,可能会