通过observable调用API的顺序

时间:2017-04-25 22:36:51

标签: android rx-java rx-android sqlbrite

嗨,我试图按顺序调用两个可观察对象,一个接一个地调用。我尝试使用合并,但它不尊重顺序,所以我去使用concat代替,主要问题是这两个Observable发出不同的类型。从我所看到的zip可以选择合并两个不同的可观察但是避开了我的头。

所以具体问题是,如何才能有一个接一个地调用顺序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())
                );

1 个答案:

答案 0 :(得分:1)

当我说得对,你的第二个流并不依赖于第一个流的结果。因此,您可以等待第一个流完成toList运算符,然后使用flatMap启动第二个流:

sectionEntitySync
    .toList() //collect results. This operator also waits for upstream's onComplete
    .flatMapObservable(list -> itemEntitySync) //launch the second observable
    .subscribe(...)