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.
Vous pouvez maintenant utiliser la méthode enqueueUniquePeriodicWork
. Il a été ajouté dans la version 1.0.0-alpha03 de WorkManager.
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.
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.