webentwicklung-frage-antwort-db.com.de

Regelmäßige tägliche Arbeitsanforderungen mit WorkManager

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.

7
Gaket

Sie können jetzt die enqueueUniquePeriodicWork-Methode verwenden. Es wurde in Version 1.0.0-alpha03 des WorkManagers hinzugefügt.

11
Greg Dan

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.

1
Khemraj

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. 

1
Gaket