2017-04-25 5 views
1

Hallo Ich versuche, zwei beobachtbare nacheinander in Reihenfolge aufgerufen werden. Ich habe versucht, Merge zu verwenden, aber es respektiert nicht Reihenfolge, also ging ich und verwendet concat stattdessen, das Hauptproblem ist, dass diese zwei Observable verschiedene Typen emittieren. Von dem, was ich gesehen habe zip könnte eine Option sein, zwei verschiedene beobachtbare zusammenführen, aber habe meinen Kopf nicht um ihn herum gewickelt.Sequenz von API-Calls durch beobachtbare

Also die konkrete Frage si, wie kann man sequentielle API Anruf nach dem anderen haben. Derzeit ist dies meine Implementierung

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

Sie benötigen die Ergebnisse von beiden? Wenn ja, wäre das keine gute Idee, beide zu einem Stream zu kombinieren. Ein Stream sollte nur für einen Typ oder für einen Supertyp gelten: SectionEntity, ItemEntity erben von 'Entity'. Das Observable würde vom Typ 'Entity' sein und Sie würden mit der Instanz prüfen, um welchen Typ es sich handelt und abhängig von dem Typ, auf den Sie verschiedene Aktionen aufrufen können. –

Antwort

1

Wie ich es richtig, Ihre zweite Strom nicht auf den Ergebnissen der ersten angewiesen ist. So konnte man nur warten, bis der erste Strom mit toList Operator abzuschließen und dann den zweiten Stream starten flatMap mit:

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