我有一个为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(...)
<...>
此方法可能会使用不同的参数多次调用,因此会生成不同的订阅。据我了解,RxJava将取消订阅onComplete
或onError
。但是,例如,有可能创建了5个订阅,并且在解析之前,用户从片段移开,因此Adapter
不再相关并且应该被收集。但是,据我所知,在解决这些问题之前,不会收集活动订阅的原因。
通常我将演示者与相关视图链接,然后将所有订阅存储在CompositeDisposable
中,并在生命周期建议清除时清除一次性(例如,视图转到onPause
州)。我可以在这里实现类似的方法,但这意味着我必须:
1)在视图和适配器之间建立关系,这样当触发视图的生命周期方法时,它将接受适配器并在其上调用取消订阅方法,然后将获取演示者并调用{{1} }。我可以依靠clear()
吗?或者我必须手动完成吗?
2)每次调用我的演示者方法来调用东西时,我都会创建一个新的订阅,这意味着onDetachedFromRecyclerView
的大小会增加,直到谁知道是什么。虽然已执行调用,但仍在CompositeDisposable
中引用了一次性用法。
我觉得这里有一个更简单的解决方案,所以希望有人可以指点我。
编辑:
另一个想到的解决方案是为每个CompositeDisposable
创建一个演示者,并为订阅者的绑定和回收链接订阅。然而,这意味着要让更多的主持人闲逛 - 但这种方法似乎更清晰。
答案 0 :(得分:0)
不确定这对任何人是否有用,但这就是我解决这个问题的方法。
我最终合并了我的Presenters
,同时为View
和ViewHolder
保留了不同的Fragment
接口(将其称为ViewHolderView
和FragmentView
})。
我喜欢为每个Presenter
设置一个ViewHolderView
,但是,它并没有真正解决我的问题。我将CompositeDisposable
保留在Presenter
内,但是使用这种方法,我必须将其移至Adapter
级别,并在Disposable
内保留对ViewHolder
的引用{1}}。与建议的答案类似here
我不喜欢手动操纵Adapter
生命周期中Fragment
的想法,因为我已在subscribe()
上调用unsubscribe()
和FragmentView
,除非您使onDetachedFromRecyclerView
RecyclerView
解决方案是在保留Adapter
界面的同时将我的Fragment
演示者与我的ViewHolderView
演示者合并。所以我最终得到了一个Presenter
和两个单独的View
接口的合同,我将Presenter
传递给Adapter
。当FragmentView
取消订阅时,它会清理所有内容。