Mit WorkManager können Sie eine Arbeitskette erstellen und in die Warteschlange einreihen, Aufgaben erstellt und definiert, in welcher Reihenfolge sie ausgeführt werden sollen. Dieses ist besonders nützlich, wenn Sie mehrere Aufgaben in einem in eine bestimmte Reihenfolge bringen.
Um eine Arbeitskette zu erstellen, können Sie
WorkManager.beginWith(OneTimeWorkRequest)
oder
WorkManager.beginWith(List<OneTimeWorkRequest>)
, die jeweils eine Instanz von
WorkContinuation
Anschließend kann ein WorkContinuation
verwendet werden, um den abhängigen OneTimeWorkRequest
hinzuzufügen.
Instanzen mit
then(OneTimeWorkRequest)
oder
then(List<OneTimeWorkRequest>)
.
Bei jedem Aufruf von WorkContinuation.then(...)
wird eine neue Instanz von WorkContinuation
zurückgegeben. Wenn Sie eine List
von OneTimeWorkRequest
Instanzen hinzufügen, können diese Anfragen möglicherweise parallel ausgeführt werden.
Schließlich können Sie den
WorkContinuation.enqueue()
zu enqueue()
Ihrer Kette von WorkContinuation
s.
Sehen wir uns ein Beispiel an. In diesem Beispiel sind 3 verschiedene Mitarbeiterjobs für die Ausführung konfiguriert (möglicherweise parallel). Die Ergebnisse dieser Worker sind an einen Worker-Job im Cache übergeben. Schließlich wird die Ausgabe an einen Upload-Worker übergeben, der die Ergebnisse in einen Remote- Server.
Kotlin
WorkManager.getInstance(myContext) // Candidates to run in parallel .beginWith(listOf(plantName1, plantName2, plantName3)) // Dependent work (only runs after all previous work in chain) .then(cache) .then(upload) // Call enqueue to kick things off .enqueue()
Java
WorkManager.getInstance(myContext) // Candidates to run in parallel .beginWith(Arrays.asList(plantName1, plantName2, plantName3)) // Dependent work (only runs after all previous work in chain) .then(cache) .then(upload) // Call enqueue to kick things off .enqueue();
Eingabe-Fusionen
Wenn Sie OneTimeWorkRequest
-Instanzen verketten, wird die Ausgabe der übergeordneten
-Anfragen als Eingabe an die untergeordneten Elemente übergeben. Im obigen Beispiel ist also
Die Ausgaben von plantName1
, plantName2
und plantName3
werden als
Eingaben für die cache
-Anfrage.
Um Eingaben aus mehreren übergeordneten Arbeitsanfragen zu verwalten, verwendet WorkManager
InputMerger
WorkManager bietet zwei verschiedene Arten von InputMerger
:
OverwritingInputMerger
versucht, der Ausgabe alle Schlüssel aus allen Eingaben hinzuzufügen. Bei Konflikten werden die zuvor festgelegten Schlüssel überschrieben.ArrayCreatingInputMerger
versucht, die Eingaben zusammenzuführen und bei Bedarf Arrays zu erstellen.
Wenn Sie einen spezifischeren Anwendungsfall haben, können Sie Ihren eigenen erstellen, indem Sie abgeleitete Klassen
InputMerger
Eingabezusammenführung überschreiben
OverwritingInputMerger
ist die standardmäßige Zusammenführungsmethode. Wenn Schlüssel vorhanden sind,
Konflikte in der Zusammenführung, dann überschreibt der letzte Wert für einen Schlüssel alle
vorherigen Versionen in den resultierenden Ausgabedaten.
Wenn z. B. die Pflanzeneingaben jeweils einen Schlüssel haben, der mit dem
Variablennamen ("plantName1"
, "plantName2"
und "plantName3"
) enthält, ist der
Daten, die an den cache
-Worker übergeben werden, haben drei Schlüssel/Wert-Paare.
Wenn es einen Konflikt gibt, gewinnt der letzte Worker, der den Vorgang abgeschlossen hat, und ihr Wert
wird an cache
übergeben.
Da Ihre Arbeitsanfragen parallel ausgeführt werden, gibt es keine Garantien für
in der sie ausgeführt werden. Im Beispiel oben könnte plantName1
einen
Wert von "tulip"
oder "elm"
, je nachdem, welcher Wert geschrieben wird
zuletzt. Wenn die Möglichkeit eines Schlüsselkonflikts besteht und Sie die gesamte Ausgabe beibehalten müssen
bei einer Zusammenführung, dann ist ArrayCreatingInputMerger
möglicherweise die bessere Option.
ArrayErstellenEingabezusammenführung
Da wir für das obige Beispiel die Ausgaben aller Pflanzen
Name Workers enthalten, sollten wir ein ArrayCreatingInputMerger
verwenden.
Kotlin
val cache: OneTimeWorkRequest = OneTimeWorkRequestBuilderP<lantWorker(>) .setInputMerger(ArrayCreatingInputMerger::class) .setConstraints(constraints) .build()
Java
OneTimeWorkRequest cache = new OneTimeWorkRequest.Builder(PlantWorker.class) .setInputMerger(ArrayCreatingInputMerger.class) .setConstraints(constraints) .build();
ArrayCreatingInputMerger
koppelt jeden Schlüssel mit einem Array. Wenn jeder der Schlüssel
eindeutig ist, ist das Ergebnis eine Reihe von Arrays mit einem Element.
Bei Schlüsselkollisionen werden die entsprechenden Werte gruppiert in einem Array.
Verkettung und Arbeitsstatus
Ketten von OneTimeWorkRequest
werden nacheinander ausgeführt, solange ihre Arbeit
erfolgreich abgeschlossen wurde (d. h. es wird ein Result.success()
zurückgegeben). Arbeit
Anfragen können fehlschlagen oder während der Ausführung abgebrochen werden. Dies hat nachgelagerte Auswirkungen auf
abhängige Arbeitsanfragen.
Wenn die erste OneTimeWorkRequest
in eine Kette von Arbeitsanfragen eingereiht wird,
Alle nachfolgenden Arbeitsanfragen werden blockiert, bis die Arbeit dieser ersten Aufgabe erledigt wird.
abgeschlossen ist.
Sobald Sie in die Warteschlange gestellt und alle Arbeitsbeschränkungen
erfüllt wurden, ist die erste Arbeitsanfrage
aktiv ist. Wenn die Arbeit im Stammverzeichnis erfolgreich abgeschlossen wurde
OneTimeWorkRequest
oder List<OneTimeWorkRequest>
(d. h., es wird eine
Result.success()
), lautet die nächste Gruppe abhängiger Arbeitsanfragen
in der Warteschlange.
Solange jede Arbeitsanfrage erfolgreich abgeschlossen wird, durch die gesamte Arbeitskette durch, bis alle Arbeiten im abgeschlossen ist. Das ist zwar der einfachste und oft bevorzugte Fall, ist genauso wichtig, um die Problematik zu kümmern.
Wenn während der Verarbeitung Ihrer Arbeitsanfrage ein Fehler auftritt, können Sie Folgendes tun: wiederholen Sie die Anfrage gemäß einer Backoff-Richtlinie, definieren. Wenn Sie eine Anfrage wiederholen, die Teil einer Kette ist, bedeutet das, dass nur diese Anfrage mit den bereitgestellten Eingabedaten wiederholt werden. Alle parallel ausgeführten Arbeiten sind davon nicht betroffen.
Weitere Informationen zum Definieren benutzerdefinierter Wiederholungsstrategien finden Sie unter Wiederholung und Backoff Richtlinien:
Wenn diese Wiederholungsrichtlinie nicht definiert oder ausgeschöpft ist oder
in dem ein OneTimeWorkRequest
Result.failure()
zurückgibt,
Arbeitsanfrage und alle abhängigen Arbeitsanfragen sind als FAILED.
gekennzeichnet
Das Gleiche gilt, wenn ein OneTimeWorkRequest
abgebrochen wird. Alle abhängigen
Arbeitsanfragen sind ebenfalls mit CANCELLED
gekennzeichnet und ihre Arbeit wird nicht ausgeführt.
Wenn Sie weitere Arbeitsanfragen an eine Kette anhängen, die fehlgeschlagen ist oder
abgebrochene Arbeitsanfragen hat, wird die neu angehängte
mit FAILED
bzw. CANCELLED
gekennzeichnet. Wenn Sie die Arbeit verlängern möchten,
einer vorhandenen Kette, siehe APPEND_OR_REPLACE
in
VorhandeneWorkPolicy.
Beim Erstellen von Ketten von Arbeitsanfragen sollten abhängige Arbeitsanfragen Wiederholungsrichtlinien sorgen, um sicherzustellen, dass Aufgaben immer zügig abgeschlossen werden. Fehlgeschlagene Arbeitsanfragen können zu unvollständigen Ketten und/oder zu einem unerwarteten Status führen.
Weitere Informationen finden Sie unter Abbrechen und Beenden Arbeit.