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将取消onComplete
或onError
。然而,它有可能有,例如,5个订阅创建的,他们都解决之前,用户从移动片段上,因此Adapter
不再是相关的,应当收集。然而,据我所知,它不会被收集活动订阅的原因,直到这些问题得到解决。
通常我联系主持人与相关视图,然后存储在一个CompositeDisposable
所有订阅和清除一次性时生命周期意味着它的时间来清除(例如,一个视图转到状态)。我可以在这里实现类似的方法,但是这意味着我必须:
1)在视图和适配器之间建立关系,以便触发视图的生命周期方法时,它将采用适配器并调用取消订阅方法,然后将采取主持人和调用clear()
。我可以依靠onDetachedFromRecyclerView
吗?或者我必须手动执行此操作?
2)每次我的主持人做东西的方法被调用时,我都会创建一个新的订阅,这意味着CompositeDisposable
的大小会增加,直到知道是谁。虽然该呼叫已执行,但一次性仍在CompositeDisposable
中引用。
我有一种感觉,这里有一个简单的解决方案,从而希望有人会在这点我。
编辑:
,想到另一种解决方案,将是为每个ViewHolder
和链接订阅演示者的约束力和持有人的回收利用。然而,这意味着要多留些主持人 - 但这种方法似乎更清洁一些。
不知道这将是对有用的人,但是这是怎么了,我解决了这个问题。
我结束了我的合并而Presenters
保持不同View
接口为ViewHolder
和Fragment
(将称他们为ViewHolderView
和FragmentView
)。
我喜欢为每个ViewHolderView
设置Presenter
的想法,但是,这并没有真正解决我的问题。我保持我的CompositeDisposable
里面Presenter
,但这种做法,我不得不把它搬出来的Adapter
水平,并保持我ViewHolder
内到Disposable
参考。答案类似建议here
我不喜欢从手动Fragment
生命周期操纵Adapter
因为我已经呼吁FragmentView
subscribe()
和unsubscribe()
的想法,onDetachedFromRecyclerView
不叫,除非你废掉的RecyclerView
适配器
解决方案是将我的Adapter
演示者与我的Fragment
演示者合并,同时保留ViewHolderView
界面。所以我结束了一个合同Presenter
和两个单独的View
接口,并且我将Presenter
传递给Adapter
。当FragmentView
取消订阅时,它会清理所有内容。
那么可观察的东西在你的主持人?主持人是否至少有基本的生命周期事件? – yosriz
是的,Rx链和'CompositeDisposable'在我的演示者中。是的,'Presenter'是故意生命周期不可知的。我的意思是我可以向它添加方法,我将调用生命周期事件,但是在Adapter中使用哪些生命周期事件?无论如何,看看我自己的答案,可能会更有意义。 – vkislicins