2017-03-16 3 views
1

Ich möchte task 1 und dann task 2 durchführen, ohne ihre emittierten Elemente zu kombinieren. Ich habe dies:Mapping Observable <Something> zu Observable <Void>

interface Service { 
    Observable<Something> doTask1(); 
    Observable<SomethingElse> doTask2(); 
} 

Ist es ein guter Ansatz, um sie Observable<Void> zu machen, um sie zurück zu fusionieren? Beide Aufgaben sind unabhängig, so dass die erste möglicherweise eine leere Observable zurückgeben, aber die zweite muss sowieso ausgeführt werden.

public Observable<Void> doTasks() { 
    Observable.merge(service.doTask1(), service.doTask2()); 
} 

Wenn ja, gibt es einen „richtigen“ Weg, um ein Observable<Something> zu Observable<Void> abzuzubilden? Ich mache es so:

public class TaskService implements Service { 
    public Observable<Void> doTask1() { 
     return getSomething().map(new Func1<Something, Void>() { 
        @Override 
        public Void call(Something something) { 
         return null; 
        } 
       }); 
    } 
} 

Jede Beratung wird geschätzt.

+0

Machst du etwas mit den Emissionen der zusammengeführten Observable? Was machen Sie weiter unten im Stream mit dem zusammengeführten Observable? – yosriz

+0

Nein, bin ich nicht. Ich möchte nur die Aufgabe ausführen. Emittierte Elemente sind nicht wichtig. –

Antwort

2

Mapping-Werte für ungültig zu erklären ist eine gültige Art und Weise, aber RxJava Completable eingeführt, die eine Variante von Observable ist, die nicht emittieren Elemente, sondern nur Fertigstellung und Fehlerbenachrichtigung. Sie können es hier verwenden, da Sie die emittierten Werte nicht interessieren. Dann erhalten Sie eine sauberere API und müssen die Werte auch nicht so abbilden, dass sie weniger bedeuten.

public Completable doTasks() {  
    Completable.merge(service.doTask1().toCompletable(), service.doTask2().toCompletable()); 
} 
+0

Genau das habe ich gesucht, danke! –

Verwandte Themen