3

我的问题是适配器订阅多个可观察对象的最佳方式是什么

我有一个具有标题和常规项目类型的适配器。适配器的信息来自使用 Sqlbrite 的数据库。使用 Sqlbrite,我想通过让适配器订阅 observable 来更新标题和列表。

对于第一个 Observable 来说不是问题。在我的片段的 OnResume 中:

    mSubscription = TrackerDbUtils.getListSubmissionObservable(db)
            .map(Submission.MAP)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(mAdapter);

但是,然后我尝试向片段添加第二个 Observable

    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> { 
    .
    .
    .

}

但是,我得到一个重复的类错误。所以我尝试实现一个泛型类型:

public class MileageTrackerAdapter extends HeaderRecyclerViewAdapter
    implements Action1<Object> { 
    .
    .
    .
    @Override
    public void call(Object o) {
        if(o instanceof Summary){
              // Logic
        } else {
              // Logic
        }
    }
}

但是我收到一个运行时错误,我无法将摘要映射到提交。即便如此,我也不确定铸造泛型是解决问题的最佳方法。

根据 dwursteisen 的反馈:

我将 Summary 类更改为映射到 Submission。我还创建了一个名为“isSummary”的新字段。我按照建议将我的 observable 更改为以下内容:

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

这会创建一个 Observable,它会触发两次;一个是批量提交列表,另一个是大小为 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();

}
4

2 回答 2

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 处理到您的适配器中

于 2015-06-07T22:22:31.310 回答
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 区分它们

于 2015-06-07T22:05:54.257 回答