1

嗨,我试图让两个 observable 依次被调用,一个接一个。我尝试使用合并,但它不尊重顺序,所以我去使用 concat 代替,主要问题是这两个 Observable 发出不同的类型。从我所看到的情况来看,zip可能是合并两个不同的 observable 的一个选项,但我还没有完全理解它。

所以具体的问题是,如何一个接一个地调用顺序 API。目前这是我的实现

 Observable<SectionEntity> sectionEntitySync = DbProvider.contentResolver(this)
                .createQuery(KitchContract.Category.CONTENT_URI, null, KitchContract.DELETED + "=?",
                        new String[] { KitchContract.NO }, KitchContract.Category.Columns.POSITION + " ASC", true)
                .mapToList(SectionEntity::new)
                .flatMap(Observable::from)
                .flatMap(sectionEntity -> getApi().create(sectionEntity)
                        .subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread()));

        Observable<ItemEntity> itemEntitySync = DbProvider.contentResolver(this)
                .createQuery(KitchContract.Item.CONTENT_URI, null, null, null,null, false)
                .mapToList(ItemEntity::new)
                .flatMap(Observable::from)
                .flatMap(itemEntity ->
                    getApi().create(itemEntity)
                            .subscribeOn(Schedulers.newThread())
                            .observeOn(AndroidSchedulers.mainThread())
                );
4

1 回答 1

1

我猜对了,您的第二个流不依赖于第一个流的结果。因此,您可以等待第一个流使用toList运算符完成,然后使用以下命令启动第二个流flatMap

sectionEntitySync
    .toList() //collect results. This operator also waits for upstream's onComplete
    .flatMapObservable(list -> itemEntitySync) //launch the second observable
    .subscribe(...)
于 2017-04-25T23:58:20.407 回答