gpt4 book ai didi

android - 订阅多个 Observable 的适配器

转载 作者:可可西里 更新时间:2023-10-31 22:03:46 25 4
gpt4 key购买 nike

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

我有一个具有 header 和常规项目类型的适配器。适配器的信息是使用 Sqlbrite 从数据库中获取的。使用 Sqlbrite,我想通过让适配器订阅一个可观察对象来更新 header 和列表。

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

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

但是,我随后尝试向 fragment 添加第二个 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 的反馈:

我将摘要类更改为映射到提交。我还创建了一个名为“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();

}

最佳答案

你应该避免对两个不同的流使用相同的适配器,因为它必须处理并发问题,你可以避免使用 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 处理到您的适配器中

关于android - 订阅多个 Observable 的适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30698730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com