web-dev-qa-db-fra.com

PeriodicWorkRequest avec WorkManager

Bien que WorkManager soit récemment introduit dans Google I/O, j'essaie d'utiliser Workmanager pour effectuer des tâches régulièrement,

Ce que je fais est, Planifier le travail en utilisant PeriodicWorkRequest comme suit:

Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
PeriodicWorkRequest build = new PeriodicWorkRequest.Builder(SyncJobWorker.class, MY_SCHEDULE_TIME, TimeUnit.MILLISECONDS)
           .addTag(TAG)
           .setConstraints(constraints)
           .build();

WorkManager instance = WorkManager.getInstance();
if (instance != null) {
          instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.REPLACE, build);
}

Le problème que je rencontre est quand je demande PeriodicWorkRequest, alors il commencera à fonctionner immédiatement,

  • Est-ce que quelqu'un sait comment arrêter cette exécution immédiate du travail? en utilisant PeriodicWorkRequest.
  • Veulent également savoir comment nous pouvons Rechedule le travail? Et si je veux changer l'heure du travail déjà programmé?

J'utilise: implementation "Android.Arch.work:work-runtime:1.0.0-alpha04"

Toute aide serait appréciée.

3
Uttam Panchasara

Vous pouvez y parvenir en utilisant la période flexible dans PeriodicWorkRequest.Builder . Par exemple, si vous souhaitez exécuter votre travailleur dans un délai de 15 minutes à la fin de l'intervalle de répétition (8 heures), le code se présentera. comme ça:

val periodicRefreshRequest = PeriodicWorkRequest.Builder(
            RefreshWorker::class.Java, // Your worker class
            8, // repeating interval
            TimeUnit.HOURS,
            15, // flex interval - worker will run somewhen within this period of time, but at the end of repeating interval
            TimeUnit.MINUTES
    )

Ilustration visuelle

1
Myroslav Kolodii

Votre code replanifie toujours le travail afin que vous puissiez modifier les paramètres de travail à votre guise

instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.REPLACE, build);

si vous souhaitez conserver le travail avec les mêmes paramètres (même après le redémarrage), sans aucune modification, utilisez:

instance.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP, build);

dans le cas où cela ne sera programmé que si les travaux ne sont pas déjà engagés.

Pour arrêter la tâche, utilisez

// cancel the unique work
instance.cancelUniqueWork(TAG);
// clear all finished or cancelled tasks from the WorkManager 
instance.pruneWork();

Btw, je pense que ce n'est pas une bonne approche d'utiliser le même TAG que l'identifiant de travail unigue et comme balise de tâche. Si vous avez besoin d'un travail unique, vous n'avez pas vraiment besoin de la balise de tâche. La balise de tâche est pour les cas, alors vous voulez avoir plusieurs tâches

0
Alex