2017-04-25 13 views
1

嗨我试图让两个可观察对象按顺序依次调用。我尝试使用合并,但它不尊重秩序,所以我去了,而不是使用concat,主要问题是这两个Observable放出不同的类型。从我所看到的zip可能是一个选项合并两个不同的observable,但没有包裹我的头。通过可观察API调用的顺序

那么具体的问题就是,一个接一个的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

你需要两者的结果吗?如果是的话,将两者合并为一个流并不是一个好主意。流只能用于一种类型或一种超类型:SectionEntity,ItemEntity从“实体”继承。 observable将是'Entity'类型,你可以检查它是什么类型的实例,并依赖于你可以调用不同动作的类型。 –

回答

1

当我得到它的权利,你的第二个流不依赖于第一个结果。所以,你可能只是等待第一个流与toList操作完成,然后启动使用flatMap第二流:

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