首页 > 解决方案 > 从 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);
}

标签: androidrx-java2android-room

解决方案


去喜欢

        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>
            }


推荐阅读