RxJava取消订阅RecyclerView适配器演示器

时间:2017-03-16 16:21:18

标签: 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(mSchedulerProvider.io())
            .observeOn(mSchedulerProvider.ui())
            .subscribe(...)
    <...>

此方法可能会使用不同的参数多次调用,因此会生成不同的订阅。据我了解,RxJava将取消订阅onCompleteonError。但是,例如,有可能创建了5个订阅,并且在解析之前,用户从片段移开,因此Adapter不再相关并且应该被收集。但是,据我所知,在解决这些问题之前,不会收集活动订阅的原因。

通常我将演示者与相关视图链接,然后将所有订阅存储在CompositeDisposable中,并在生命周期建议清除时清除一次性(例如,视图转到onPause州)。我可以在这里实现类似的方法,但这意味着我必须:

1)在视图和适配器之间建立关系,这样当触发视图的生命周期方法时,它将接受适配器并在其上调用取消订阅方法,然后将获取演示者并调用{{1} }。我可以依靠clear()吗?或者我必须手动完成吗?

2)每次调用我的演示者方法来调用东西时,我都会创建一个新的订阅,这意味着onDetachedFromRecyclerView的大小会增加,直到谁知道是什么。虽然已执行调用,但仍在CompositeDisposable中引用了一次性用法。

我觉得这里有一个更简单的解决方案,所以希望有人可以指点我。

编辑:

另一个想到的解决方案是为每个CompositeDisposable创建一个演示者,并为订阅者的绑定和回收链接订阅。然而,这意味着要让更多的主持人闲逛 - 但这种方法似乎更清晰。

1 个答案:

答案 0 :(得分:0)

不确定这对任何人是否有用,但这就是我解决这个问题的方法。

我最终合并了我的Presenters,同时为ViewViewHolder保留了不同的Fragment接口(将其称为ViewHolderViewFragmentView })。

我喜欢为每个Presenter设置一个ViewHolderView,但是,它并没有真正解决我的问题。我将CompositeDisposable保留在Presenter内,但是使用这种方法,我必须将其移至Adapter级别,并在Disposable内保留对ViewHolder的引用{1}}。与建议的答案类似here

我不喜欢手动操纵Adapter生命周期中Fragment的想法,因为我已在subscribe()上调用unsubscribe()FragmentView,除非您使onDetachedFromRecyclerView

上的适配器无效,否则不会调用RecyclerView

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