Ich habe angefangen, rxjava mit meinen Android-Projekten zu benutzen. Ich muss die Ereignisliste von einem API-Aufruf sortieren. Ich schrieb Komparator-Klasse, um Liste zu sortieren:
%Vor%Ich kann diese Klasse mit der klassischen Collections-Klasse verwenden.
%Vor%Wie kann ich diese Situation auf reaktive Weise erreichen? Auch wenn es eine Möglichkeit gibt, die Liste asynchron zu sortieren, würde ich das bevorzugen.
Reaktiver Weg ohne Sortierliste:
%Vor% Wenn ich das Javadoc für Collections.sort()
, ich hätte etwas wie map
(list -> Collections.sort (list, comparator))
, um es in ein sortiertes Array zu konvertieren; Hier ist map
der beobachtbare Mapper.
Die obige Methode sort
ist jedoch ein In-Place-Sortieralgorithmus, der das zugrunde liegende Array beeinflusst und nicht das vollständig sortierte Array zurückgibt. Also solltest du stattdessen so etwas tun:
Dies sortiert jede eingehende List<EventParticipant>
einzeln und asynchron.
Diese Lösung ähnelt der akzeptierten Antwort, verwendet aber Rx-Operatoren, um 1) das Array in Objekte aufzuteilen 2) nach den Instanzen zu sortieren Vergleichbare Implementierung 3) auf einem dedizierten Berechnungs-Thread;
%Vor%Beachten Sie, dass Schedulers.io für Netzwerk- / Festplattenschreibvorgänge, Schedulers.computation für Berechnungen wie Sortieren
bevorzugt wird Ich gehe davon aus, dass die Methode getParticipants()
Observable<List<EventPartcipant>>
zurückgibt.
Im folgenden Ausschnitt konvertiere ich zuerst Observable<List<EventPartcipant>>
in Observable<EventParticipant>
mit dem Operator flatMap()
. Diese Observable gibt jeweils EventParticipant
einzeln aus. Jetzt kann ich mit dem toSortedList()
-Operator gleichzeitig auf zwei EventParticipant
-Objekte zugreifen, genau wie Comparator<EventParticipant>::compareTo
erwartet.
In den anderen Lösungen werden Sortieroperatoren nach .observeOn(AndroidSchedulers.mainThread())
angewendet, was bedeutet, dass die eigentliche Sortierung im UI-Thread erfolgt.
Ich habe dies geändert, damit der API-Aufruf im E / A-Scheduler ausgeführt werden kann, wobei der Berechnungsplaner und schließlich die sortierte Liste im UI-Thread sortiert wird.
%Vor%Es gibt noch eine weitere Möglichkeit, die Liste zu sortieren
%Vor%Tags und Links android sorting rx-java collections rx-android