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调用生命周期事件,但是在
适配器中使用哪些生命周期事件
?无论如何,看看我自己的答案,可能会