android - 从 Rxjava 中的 Observable 获取列表的最佳方法
问题描述
我只是在我的一个 android 应用程序中探索 Rxjava,并被困在一个地方,老实说,我对这个库很陌生,所以不要介意我的问题是否让某人感到沮丧;-)
因此,我尝试使用 RxJava 访问 Room 数据库,并在其中返回 Observable 列表,一旦获得此 Observable,我将尝试使用 map 运算符获取 id 列表并再次查询数据库,这又返回了我Observable List 但 map 运算符期望 List 作为返回类型。我该如何解决这个问题请建议?
下面是代码片段:
private void getAllPcbs() {
isLoading.setValue(true);
getCompositeDisposable().add(
getRepositoryManager().loadAllPcbDetails()
.flatMap((Function<List<PcbDetails>, ObservableSource<?>>) pcbDetails -> {
List<Long> pcbList = new ArrayList<>();
for (PcbDetails details : pcbDetails)
pcbList.add(details.getPcbId());
return getRepositoryManager().loadAllPcbs(pcbList);
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onSuccess, this::onError)
);
}
private void onError(Throwable throwable) {
isLoading.setValue(false);
}
private void onSuccess(Object o) {
isLoading.setValue(false);
pcbList.setValue((List<Pcb>) o);
}
public interface DbHelper {
Observable<List<PcbDetails>> loadAllPcbDetails();
Observable<List<Pcb>> loadAllPcbs(List<Long> pcbIdList);
}
解决方案
去喜欢
getRepositoryManager().loadAllPcbDetails()
.flatMapIterable {
listPcbDetail-> listPcbDetail
// listPcbDetail is ArrayList<PcbDetails>
// Converts your list of ids into an Observable
// which emits every item in the list
}
.flatMap { pcbDetail ->
// pcbDetail is PcbDetails
getRepositoryManager().loadAllPcbs(pcbDetail.pcbIdList)
}.subscribe { listPcb ->
// listPcb is ArrayList<Pcb>
}
推荐阅读
- python - 应用 n.where 后如何重塑 Numpy 数组?
- scrapy - 蜘蛛在处理一个项目一小时后停止
- python - Python os.popen 引号内的引号错误
- android - 不要在 android 8.0.0 上隐藏导航抽屉
- graphene-django - DjangoObjectType 的 graphene-django 自定义 get_queryset 不起作用
- c# - 中断以在 Botframework 上运行新对话框
- c# - c# MailMessage 来自电子邮件地址的显示名称不起作用
- python - 如何在打印时返回不带 /n 的字符串
- swift - 突出显示鼠标光标下的 NSWindow
- git - 是否可以还原在 Visual Studio -> Team Explorer -> Git 中所做的撤消更改?