TL; DR
Wie konvertiere ich Task.whenAll(List<Task>)
in RxJava
?
Mein vorhandener Code verwendet Bolts, um eine Liste asynchroner Aufgaben zu erstellen, und wartet, bis alle diese Aufgaben abgeschlossen sind, bevor andere Schritte ausgeführt werden. Im Wesentlichen wird eine erstellt List<Task>
und eine einzelne zurückgegeben, Task
die als erledigt markiert wird, wenn alle Aufgaben in der Liste abgeschlossen sind, wie im Beispiel auf der Bolts-Site .
Ich bin auf der Suche ersetzen Bolts
mit RxJava
und ich gehe davon aus, diese Methode der eine Liste von Asynchron - Aufgaben Aufbau (Größe im Voraus nicht bekannt) und Wickeln sie alle in eine einzige Observable
ist möglich, aber ich weiß nicht, wie.
Ich habe versucht , Blick auf merge
, zip
, concat
etc ... aber kann nicht zur Arbeit auf das bekommen , List<Observable>
dass ich den Aufbau würde , da sie alle nur zwei zu arbeiten darauf ausgerichtet zu sein scheinen Observables
zu einer Zeit , wenn ich die Dokumentation richtig verstehen.
Ich versuche zu lernen RxJava
und bin noch sehr neu darin. Verzeihen Sie mir, wenn dies eine offensichtliche Frage ist oder irgendwo in den Dokumenten erklärt wird. Ich habe versucht zu suchen. Jede Hilfe wäre sehr dankbar.
quelle
onErrorResumeNext
, Beispiel:Observable.zip(ob1, ob2........).onErrorResumeNext(Observable.<String>empty())
Sie können verwenden,
flatMap
wenn Sie dynamische Aufgaben Komposition haben. Etwas wie das:Ein weiteres gutes Beispiel für die parallele Ausführung
Hinweis: Ich kenne Ihre Anforderungen an die Fehlerbehandlung nicht wirklich. Zum Beispiel, was zu tun ist, wenn nur eine Aufgabe fehlschlägt. Ich denke, Sie sollten dieses Szenario überprüfen.
quelle
zip
benachrichtigt über den Abschluss, sobald eine der Aufgaben erledigt ist und ist daher nicht anwendbar.new Func1<Observable<Boolean>, Observable<Boolean>>()...
und das zweite durchnew Func1<List<Boolean>, Boolean>()
Von den vorgeschlagenen Vorschlägen kombiniert zip () tatsächlich beobachtbare Ergebnisse miteinander, was möglicherweise das ist, was gewünscht wird oder nicht, aber in der Frage nicht gestellt wurde. In der Frage war alles, was gewünscht wurde, die Ausführung jeder der Operationen, entweder einzeln oder parallel (was nicht spezifiziert wurde, aber das Beispiel für verknüpfte Schrauben betraf die parallele Ausführung). Außerdem wird zip () sofort abgeschlossen, wenn eine der Observablen abgeschlossen ist, sodass die Anforderungen verletzt werden.
Für die parallele Ausführung von Observables ist flatMap () in der anderen Antwort in Ordnung, merge () wäre jedoch einfacher. Beachten Sie, dass die Zusammenführung bei einem Fehler eines der Observables beendet wird. Wenn Sie den Exit lieber verschieben, bis alle Observables abgeschlossen sind, sollten Sie sich mergeDelayError () ansehen .
Ich denke, für eins nach dem anderen sollte die statische Methode Observable.concat () verwendet werden. Seine Javadoc-Zustände lauten wie folgt:
Das klingt nach dem, wonach Sie suchen, wenn Sie keine parallele Ausführung wünschen.
Wenn Sie nur an der Fertigstellung Ihrer Aufgabe interessiert sind und keine Werte zurückgeben möchten, sollten Sie sich wahrscheinlich mit Completable anstelle von Observable befassen .
TLDR: Ich denke, Completable.concat () ist am besten geeignet, um Aufgaben und Ereignisse nach Abschluss einzeln auszuführen. Bei paralleler Ausführung klingt Completable.merge () oder Completable.mergeDelayError () nach der Lösung. Ersteres stoppt sofort bei einem Fehler bei einem Abschluss, letzteres führt alle aus, auch wenn einer von ihnen einen Fehler aufweist, und meldet den Fehler erst dann.
quelle
Mit Kotlin
Es ist wichtig, den Typ für die Argumente der Funktion festzulegen, da sonst Kompilierungsfehler auftreten
Der letzte Argumenttyp ändert sich mit der Anzahl der Argumente: BiFunction for 2 Function3 for 3 Function4 for 4 ...
quelle
Sie haben sich wahrscheinlich den
zip
Operator angesehen, der mit 2 Observables arbeitet.Es gibt auch die statische Methode
Observable.zip
. Es hat eine Form, die für Sie nützlich sein sollte:Sie können das Javadoc für mehr überprüfen .
quelle
Ich schreibe einen Rechencode in Kotlin mit JavaRx Observables und RxKotlin. Ich möchte eine Liste der zu vervollständigenden Observablen beobachten und mir in der Zwischenzeit ein Update mit dem Fortschritt und dem neuesten Ergebnis geben. Am Ende wird das beste Berechnungsergebnis zurückgegeben. Eine zusätzliche Anforderung bestand darin, Observables parallel auszuführen, um alle meine CPU-Kerne zu verwenden. Am Ende hatte ich diese Lösung:
quelle
@Volatile
, aber wie würde dies funktionieren, wenn dies von mehreren Threads gleichzeitig aufgerufen wird? Was würde mit den Ergebnissen passieren?Ich hatte ein ähnliches Problem. Ich musste Suchelemente aus dem Restanruf abrufen und gleichzeitig gespeicherte Vorschläge aus einem RecentSearchProvider.AUTHORITY integrieren und zu einer einheitlichen Liste zusammenfassen. Ich habe versucht, die @ MyDogTom-Lösung zu verwenden, leider gibt es in RxJava keine Observable.from. Nach einigen Recherchen bekam ich eine Lösung, die für mich funktionierte.
Ich habe aus dem Array von Observablen ein Observable erstellt, das je nach Abfrage Listen mit Vorschlägen und Ergebnissen aus dem Internet enthält. Danach gehen Sie diese Aufgaben einfach mit flatMapIterable durch und führen sie mit flatmap aus. Platzieren Sie die Ergebnisse in einem Array, das später in eine Recyclingansicht abgerufen werden kann.
quelle
Wenn Sie Project Reactor verwenden, können Sie verwenden
Mono.when
.quelle