从Rxjava中的Observable获取列表的最佳方法

时间:2019-02-22 06:11:35

标签: android rx-java2 android-room

我只是在我的一个android应用程序中浏览Rxjava,并停留在一个地方,说实话我对这个库非常陌生,所以请不要介意我的问题是否使某人感到沮丧;-)

因此,我尝试使用RxJava访问“房间”数据库,并在其中返回“可观察到的列表”,一旦获得此“可观察到的”,我试图使用地图运算符获取ID列表并再次查询数据库,再次返回Observable List,但地图操作员希望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);
}

1 个答案:

答案 0 :(得分:1)

喜欢

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