web-dev-qa-db-fra.com

Demandes de travail quotidiennes périodiques à l'aide de WorkManager

Comment utiliser correctement la nouvelle WorkManager d'Android Jetpack pour planifier un travail périodique journalier qui doit effectuer certaines actions quotidiennement et exactement une fois?

L'idée était de vérifier si le travail avec une balise donnée existe déjà avec WorkManager et de commencer un nouveau travail périodique sinon.

J'ai essayé de le faire en utilisant l'approche suivante:

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);
}

Mais la value est toujours nulle, même si je mets un point d'arrêt à l'intérieur de la méthode Worker's doWork() (elle est donc en cours) et vérifie le statut de travail d'un autre thread.

7
Gaket

Vous pouvez maintenant utiliser la méthode enqueueUniquePeriodicWork. Il a été ajouté dans la version 1.0.0-alpha03 de WorkManager.

11
Greg Dan

Vous recherchez enqueueUniquePeriodicWork

Cette méthode vous permet de mettre en file d'attente un nom uniquePeriodicWorkRequest , où un seul PeriodicWorkRequest d'un nom particulier peut être actif à la fois. Par exemple, vous pouvez seulement voulez qu'une opération de synchronisation soit active. S'il y en a un en attente, vous pouvez choisissez de le laisser fonctionner ou remplacez-le par votre nouveau travail.

Exemple de code

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);
}

Vous obtenez deux types de ExistingPeriodicWorkPolicy

GARDER

S'il existe déjà des travaux en attente portant le même nom unique, faites rien.

REMPLACER

S'il existe déjà des travaux en attente portant le même nom unique, annulez et supprimez-le.

1
Khemraj

J'ai finalement compris que le problème résidait dans la manière dont la variable LiveData était utilisée. Parce qu'il n'y a pas d'observateurs, il n'y a pas de valeur à l'intérieur.

Le seul problème avec l’utilisation de la variable PeriodicWork est qu’elle ne garantit pas l’unicité du travail que vous souhaitez effectuer. En d’autres termes, il est possible d’avoir de nombreuses œuvres qui seront actives simultanément et qui tireront plus de temps que nécessaire. 

1
Gaket