2017-08-18 8 views
0

Ich habe den folgenden Code:RxJava Single.concat

model.getCategories() 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Action1<List<Category>>() 
       { 
        @Override 
        public void call(final List<Category> categories) 
        { 
         model.getUnits() 
           .subscribeOn(Schedulers.io()) 
           .observeOn(AndroidSchedulers.mainThread()) 
           .subscribe(new Action1<List<Unit>>() 
           { 
            @Override 
            public void call(List<Unit> units) 
            { 
             view.showAddProductDialog(units, categories); 
            } 
           }); 
        } 
       }); 

Ich habe diese hässliche Verschachtelung. Wie kann ich es reparieren. Ich habe versucht, so etwas wie diese:

Single.concat(model.getCategories(), model.getUnits()) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Action1<List<? extends Object>>() 
       { 
        @Override 
        public void call(List<? extends Object> objects) 
        { 
         // do something 
        } 
       }); 

Aber das Problem ist, dass ich kann nicht bestimmt, ob es sich List<Category> oder List<Unit> kommt.

Gibt es eine Möglichkeit, concat zu verwenden und festzustellen, welche Art von Stream kommt (List<Category> oder List<Unit> oder etwas anderes)?

Auch ich muss erkennen, dass alle Beobachter abgeschlossen sind, um eine weitere Aktion durchzuführen.

Danke in Beratung.

Antwort

1

Verwenden Single.zip():

Single.zip(
    getCategories().subscribeOn(Schedulers.io()), 
    getUnits().subscribeOn(Schedulers.io()), 
    (a, b) -> Pair.of(a, b) 
) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(
    pair -> view.showAddProductDialog(pair.first, pair.second), 
    error -> showError(error.toString()) 
) 

wo Pair kann jedes Tupel Implementierung sein, d.h. this.

+0

Ich sehe, es sollte für dieses Beispiel funktionieren, aber was wäre, wenn es mehr geschachtelte Aktionen hätte, nicht nur 2. – Andrey

+0

Protip: schau dir die [javadoc] (http://reactivex.io/RxJava/2.x /javadoc/io/reactivex/Single.html#zip(io.reactivex.SingleSource,%20io.reactivex.SingleSource,%20io.reactivex.SingleSource,%20io.reactivex.functions.Function3)) und/oder welche Methode Überladungen Pop in Content-Assist Ihrer IDE bei der Eingabe von 'Single.'. – akarnokd