RxJava在RecyclerView适配器主持人

问题描述:

退订我有一个是为RecyclerView.Adapter创建一个主持人。演示者有调用API层的方法,然后更改一些本地数据值。这被实现为Rx链:RxJava在RecyclerView适配器主持人

public void doStuff(Object args) { 
    mRemote.doStuff(args) 
      .doOnNext(count -> mLocal.setStuffCount(count)) 
      .firstOrError() 
      .subscribeOn(mSchedulerProvider.io()) 
      .observeOn(mSchedulerProvider.ui()) 
      .subscribe(...) 
    <...> 

该方法可能会被多次调用不同的参数,因此会生成不同的订阅。据我了解,RxJava将取消onCompleteonError。然而,它有可能有,例如,5个订阅创建的,他们都解决之前,用户从移动片段上,因此Adapter不再是相关的,应当收集。然而,据我所知,它不会被收集活动订阅的原因,直到这些问题得到解决。

通常我联系主持人与相关视图,然后存储在一个CompositeDisposable所有订阅和清除一次性时生命周期意味着它的时间来清除(例如,一个视图转到状态)。我可以在这里实现类似的方法,但是这意味着我必须:

1)在视图和适配器之间建立关系,以便触发视图的生命周期方法时,它将采用适配器并调用取消订阅方法,然后将采取主持人和调用clear()。我可以依靠onDetachedFromRecyclerView吗?或者我必须手动执行此操作?

2)每次我的主持人做东西的方法被调用时,我都会创建一个新的订阅,这意味着CompositeDisposable的大小会增加,直到知道是谁。虽然该呼叫已执行,但一次性仍在CompositeDisposable中引用。

我有一种感觉,这里有一个简单的解决方案,从而希望有人会在这点我。

编辑:

,想到另一种解决方案,将是为每个ViewHolder和链接订阅演示者的约束力和持有人的回收利用。然而,这意味着要多留些主持人 - 但这种方法似乎更清洁一些。

+0

那么可观察的东西在你的主持人?主持人是否至少有基本的生命周期事件? – yosriz

+0

是的,Rx链和'CompositeDisposable'在我的演示者中。是的,'Presenter'是故意生命周期不可知的。我的意思是我可以向它添加方法,我将调用生命周期事件,但是在Adapter中使用哪些生命周期事件?无论如何,看看我自己的答案,可能会更有意义。 – vkislicins

不知道这将是对有用的人,但是这是怎么了,我解决了这个问题。

我结束了我的合并而Presenters保持不同View接口为ViewHolderFragment(将称他们为ViewHolderViewFragmentView)。

我喜欢为每个ViewHolderView设置Presenter的想法,但是,这并没有真正解决我的问题。我保持我的CompositeDisposable里面Presenter,但这种做法,我不得不把它搬出来的Adapter水平,并保持我ViewHolder内到Disposable参考。答案类似建议here

我不喜欢从手动Fragment生命周期操纵Adapter因为我已经呼吁FragmentViewsubscribe()unsubscribe()的想法,onDetachedFromRecyclerView不叫,除非你废掉的RecyclerView适配器

解决方案是将我的Adapter演示者与我的Fragment演示者合并,同时保留ViewHolderView界面。所以我结束了一个合同Presenter和两个单独的View接口,并且我将Presenter传递给Adapter。当FragmentView取消订阅时,它会清理所有内容。