Wie kann man die neue WorkManager
von Android Jetpack richtig einsetzen, um eine tägliche Arbeit zu planen, die täglich und genau einmal ausgeführt werden soll?
Die Idee bestand darin, mit WorkManager
zu prüfen, ob die Arbeit mit einem bestimmten Tag bereits existiert, und ansonsten eine neue periodische Arbeit zu beginnen.
Ich habe es mit dem nächsten Ansatz versucht:
public static final String CALL_INFO_WORKER = "Call worker";
...
WorkManager workManager = WorkManager.getInstance();
List<WorkStatus> value = workManager.getStatusesByTag(CALL_INFO_WORKER).getValue();
if (value == null) {
WorkRequest callDataRequest = new PeriodicWorkRequest.Builder(CallInfoWorker.class,
24, TimeUnit.HOURS, 3, TimeUnit.HOURS)
.addTag(CALL_INFO_WORKER)
.build();
workManager.enqueue(callDataRequest);
}
Die Variable value
ist jedoch immer null, auch wenn ich einen Haltepunkt in die doWork()
-Methode der Variable Worker
setze (also definitiv in Bearbeitung ist) und den Arbeitsstatus in einem anderen Thread überprüfen.
Sie können jetzt die enqueueUniquePeriodicWork
-Methode verwenden. Es wurde in Version 1.0.0-alpha03 des WorkManagers hinzugefügt.
Sie suchen enqueueUniquePeriodicWork
Diese Methode ermöglicht es Ihnen, einen eindeutig benannten Namen einzugebenPeriodicWorkRequest , wobei nur eine PeriodicWorkRequest eines Ein bestimmter Name kann zu einem Zeitpunkt aktiv sein. Zum Beispiel können Sie nur möchte, dass eine Synchronisationsoperation aktiv ist. Wenn eine ausstehend ist, können Sie Lassen Sie es laufen oder ersetzen Sie es durch Ihre neue Arbeit.
Beispielcode
public static final String TAG_MY_WORK = "mywork";
public static void scheduleWork(String tag) {
PeriodicWorkRequest.Builder photoCheckBuilder =
new PeriodicWorkRequest.Builder(WorkManagerService.class, 1, TimeUnit.DAYS);
PeriodicWorkRequest request = photoCheckBuilder.build();
WorkManager.getInstance().enqueueUniquePeriodicWork(tag, ExistingPeriodicWorkPolicy.KEEP , request);
}
Sie erhalten zwei Arten von ExistingPeriodicWorkPolicy
BEHALTEN
Wenn ausstehende Arbeit mit demselben eindeutigen Namen vorhanden ist, führen Sie .__ aus. nichts.
ERSETZEN
Wenn ausstehende Arbeit mit demselben eindeutigen Namen vorhanden ist, brechen Sie .__ ab. und lösche es.
Schließlich verstand ich, dass das Problem in der Art und Weise liegt, wie die LiveData
verwendet wird. Da es keine Beobachter gibt, gibt es keinen Wert im Inneren.
Wenn Sie nur die Variable PeriodicWork
verwenden, besteht das Problem darin, dass die Eindeutigkeit der gewünschten Arbeit nicht sichergestellt ist. Mit anderen Worten, es ist möglich, dass viele Werke gleichzeitig aktiv sind und mehr als je zuvor ausgelöst werden.