Android 订阅多个观测值的适配器

Android 订阅多个观测值的适配器,android,android-sqlite,baseadapter,rx-java,sqlbrite,Android,Android Sqlite,Baseadapter,Rx Java,Sqlbrite,我的问题是,适配器订阅多个观测值的最佳方式是什么 我有一个适配器,它有一个标题和常规项类型。适配器的信息来自使用Sqlbrite的数据库。使用Sqlbrite,我希望通过让适配器订阅一个可观察的对象来更新标题和列表 对于第一个可观察的对象来说,这不是问题。在我的个人简历中: mSubscription = TrackerDbUtils.getListSubmissionObservable(db) .map(Submission.MAP)

我的问题是,适配器订阅多个观测值的最佳方式是什么

我有一个适配器,它有一个标题和常规项类型。适配器的信息来自使用Sqlbrite的数据库。使用Sqlbrite,我希望通过让适配器订阅一个可观察的对象来更新标题和列表

对于第一个可观察的对象来说,这不是问题。在我的个人简历中:

    mSubscription = TrackerDbUtils.getListSubmissionObservable(db)
            .map(Submission.MAP)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(mAdapter);
然而,我随后尝试向片段添加第二个可观察到的内容

    mHeaderSubscription = TrackerDbUtils.getSummaryObservable(db)
            .map(Summary.MAP)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(mAdapter);
因此,我需要在适配器中实现Action1:

public class MileageTrackerAdapter extends HeaderRecyclerViewAdapter
    implements Action1<List<Submission>>, Action1<Summary> { 
    .
    .
    .

}
这创造了一个可观察的,将发射两次;一次用于提交的批量列表,另一次作为大小为1的列表。这个列表实际上是摘要。在我的适配器中:

@Override
public void call(List<Submission> mSubmissions) {

    if(mSubmissions.size() == 1 && mSubmissions.get(0).isSummary()){
        mSummary = mSubmissions.get(0);
    } else {
        mArray = new ArrayList<>(mSubmissions);
    }

    notifyDataSetChanged();

}
@覆盖
公共作废调用(列表mSubmissions){
if(mSubmissions.size()==1&&mSubmissions.get(0.isSummary()){
mSummary=mSubmissions.get(0);
}否则{
mArray=新阵列列表(mSubmissions);
}
notifyDataSetChanged();
}

也许有人会给出更好的答案,但在这种情况下,我通常会创建这些接口的公共最终匿名实例。因此,代码如下所示:

public class Adapter extends HeaderRecyclerViewAdapter {

    public final Action1<Summary> summary = new Action1<Summary> { ... }
    public final Action1<List<Submission>> submissions = new Action1<List<Submission>> { ... }

}
公共类适配器扩展了HeaderRecyclServiceAdapter{
公共最终行动1摘要=新行动1{…}
公共最终行动1提交=新行动1{…}
}

这样,两个Action1实现中的方法都可以访问Adapter类中的所有内容,就好像它们是普通方法一样,我可以通过使用mAdapter.summary或mAdapter.submissions同时区分它们,您应该避免对两个不同的流使用相同的适配器,因为它必须处理并发问题,您可以避免使用RxJava

为什么不尝试将流合并成一个流,然后只使用一个适配器呢

TrackerDbUtils.getListSubmissionObservable(db)
        .map(Submission.MAP)
        .mergeWith(TrackerDbUtils.getSummaryObservable(db)
                                  .map(Summary.MAP))
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(mAdapter);

您可能需要将
列表
摘要
映射到相同的通用类型,或者将对象处理到适配器中

您能否详细说明并发问题?我是RxJava的新手,所以我觉得订阅多个观测值是RxJava的一个额外优势。不是这样吗?订阅服务器/观察者的onNext方法可能会在同一时间被调用,因为共享同一订阅服务器/观察者的每个观察者可能会在不同的线程上下文中观察到。
public class Adapter extends HeaderRecyclerViewAdapter {

    public final Action1<Summary> summary = new Action1<Summary> { ... }
    public final Action1<List<Submission>> submissions = new Action1<List<Submission>> { ... }

}
TrackerDbUtils.getListSubmissionObservable(db)
        .map(Submission.MAP)
        .mergeWith(TrackerDbUtils.getSummaryObservable(db)
                                  .map(Summary.MAP))
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(mAdapter);