我的问题是适配器订阅多个可观察对象的最佳方式是什么
我有一个具有标题和常规项类型的适配器。适配器的信息使用Sqlbrite从数据库提供。使用Sqlbrite,我想通过让适配器订阅一个observable来更新头和列表。
第一个Observable不是问题。在我的片段的OnResume:
x
然而,我尝试在片段中添加第二个Observable
mSubscription = TrackerDbUtils.getListSubmissionObservable(db)
.map(Submission.MAP)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mAdapter);
所以,我需要在我的适配器中实现Action1:
mHeaderSubscription = TrackerDbUtils.getSummaryObservable(db)
.map(Summary.MAP)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mAdapter);
但是,我遇到了重复的类错误。所以我尝试实现泛型类型:
public class MileageTrackerAdapter extends HeaderRecyclerViewAdapter
implements Action1<List<Submission>>, Action1<Summary> {
.
.
.
}
但是我收到运行时错误,我无法将摘要映射到提交。即便如此,我也不确定使用通用方法是解决问题的最佳方法。
根据dwursteisen的反馈意见:
我将Summary类更改为映射到Submission。我还创建了一个名为&#34; isSummary的新字段。&#34;我按照建议改变了我的观察结果:
public class MileageTrackerAdapter extends HeaderRecyclerViewAdapter
implements Action1<Object> {
.
.
.
@Override
public void call(Object o) {
if(o instanceof Summary){
// Logic
} else {
// Logic
}
}
}
这会创建一个会发射两次的Observable;一次用于批量提交列表,另一次用作大小为1的列表。此列表实际上是摘要。在我的适配器中:
TrackerDbUtils.getListSubmissionObservable(db)
.map(Submission.MAP)
.mergeWith(TrackerDbUtils.getSummaryObservable(db)
.map(Summary.MAP))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mAdapter);
答案 0 :(得分:2)
你应该避免对两个不同的流使用相同的适配器,因为它必须处理并发问题,你可以避免使用RxJava。
为什么不尝试将您的流合并为一个,然后只使用一个适配器?
TrackerDbUtils.getListSubmissionObservable(db)
.map(Submission.MAP)
.mergeWith(TrackerDbUtils.getSummaryObservable(db)
.map(Summary.MAP))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mAdapter);
您可能需要将List<Submission>
和Summary
映射到相同的公共类型,或者将Object处理到您的适配器
答案 1 :(得分:1)
也许有人会给出更好的答案,但在这种情况下,我通常会创建这些界面的公共最终匿名实例。所以代码看起来像这样:
public class Adapter extends HeaderRecyclerViewAdapter {
public final Action1<Summary> summary = new Action1<Summary> { ... }
public final Action1<List<Submission>> submissions = new Action1<List<Submission>> { ... }
}
这样,两个Action1实现中的方法都可以访问Adapter类中的所有内容,就像它们是普通方法一样,我可以通过使用mAdapter.summary或mAdapter.submissions来同时区分它们