Comment puis-je vérifier si WorkManager
est déjà planifié.
Voici mon code qui planifie WorkManager
.
public static void scheduleWork() {
PeriodicWorkRequest.Builder photoCheckBuilder =
new PeriodicWorkRequest.Builder(WorkManagerService.class, TIME_INTERVAL_IN_SECONDS,
TimeUnit.SECONDS);
PeriodicWorkRequest photoCheckWork = photoCheckBuilder.build();
WorkManager instance = WorkManager.getInstance();
if (instance != null) {
instance.enqueueUniquePeriodicWork("TAG", ExistingPeriodicWorkPolicy.KEEP , photoCheckWork);
}
}
J'appelle scheduleWork()
dans onCreate()
de ma Application
classe. Même moi, je peux vérifier que mon service fonctionne ou non en cette méthode. Mais je ne veux pas planifier WorkManager s'il est déjà planifié pour supprimer les incohérences dans le temps planifié.
Comme
if(!workManagerIsScheduled())
{
scheduleWork();
}
Des solutions?
Si vous devez vérifier le gestionnaire de travaux en cours d'exécution simplement parce que vous ne voulez pas de travaux en double. Vous pouvez simplement utiliser enqueueUniquePeriodicWork ()
Cette méthode vous permet de mettre en file d'attente un PeriodicWorkRequest au nom unique, où un seul PeriodicWorkRequest d'un nom particulier peut être actif à la fois. Par exemple, vous pouvez souhaiter qu'une seule opération de synchronisation soit active. S'il y en a un en attente, vous pouvez choisir de le laisser s'exécuter ou de le remplacer par votre nouveau travail.
Vous n'avez donc pas à vous soucier de la duplication des œuvres.
workmanager.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP , photoCheckWork);
ExistingPeriodicWorkPolicy.KEEP
Et ExistingPeriodicWorkPolicy.REPLACE
.J'ai créé cette méthode quand je n'en ai pas trouvé.
if (your_work_manager.version >= 1.0.0-alpha11)
private boolean isWorkScheduled(String tag) {
WorkManager instance = WorkManager.getInstance();
ListenableFuture<List<WorkInfo>> statuses = instance.getWorkInfosByTag(tag);
try {
boolean running = false;
List<WorkInfo> workInfoList = statuses.get();
for (WorkInfo workInfo : workInfoList) {
WorkInfo.State state = workInfo.getState();
running = state == WorkInfo.State.RUNNING | state == WorkInfo.State.ENQUEUED;
}
return running;
} catch (ExecutionException e) {
e.printStackTrace();
return false;
} catch (InterruptedException e) {
e.printStackTrace();
return false;
}
}
if (your_work_manager.version < 1.0.0-alpha11)
private boolean isWorkScheduled(String tag) {
WorkManager instance = WorkManager.getInstance();
LiveData<List<WorkStatus>> statuses = instance.getStatusesByTag(tag);
if (statuses.getValue() == null) return false;
boolean running = false;
for (WorkStatus workStatus : statuses.getValue()) {
running = workStatus.getState() == State.RUNNING | workStatus.getState() == State.ENQUEUED;
}
return running;
}
Il renverra true
quand une partie de sa tâche est RUNNING
ou ENQUEUED
.
public static final String TAG_MY_WORK = "mywork";
if(!isWorkScheduled(TAG_MY_WORK)) { // check if your work is not already scheduled
scheduleWork(TAG_MY_WORK); // schedule your work
}
public static void scheduleWork(String tag) {
PeriodicWorkRequest.Builder photoCheckBuilder =
new PeriodicWorkRequest.Builder(WorkManagerService.class, TIME_INTERVAL_IN_SECONDS,
TimeUnit.SECONDS);
PeriodicWorkRequest photoCheckWork = photoCheckBuilder.build();
WorkManager instance = WorkManager.getInstance();
instance.enqueueUniquePeriodicWork(tag, ExistingPeriodicWorkPolicy.KEEP , photoCheckWork);
}
de 1.0.0-alpha11 avec beaucoup de choses WorkStatus ne fonctionnera pas c'est supprimé et c'est un changement de rupture. Vérifier les notes de publication
WorkStatus a été renommé WorkInfo. Toutes les variantes de méthode getStatus correspondantes ont été renommées en variantes getWorkInfo correspondantes. Il s'agit d'un changement de rupture.
après la mise à jour vers alpha11, le code de travail est.
private boolean isWorkScheduled(List<WorkInfo> workInfos) {
boolean running = false;
if (workInfos == null || workInfos.size() == 0) return false;
for (WorkInfo workStatus : workInfos) {
running = workStatus.getState() == WorkInfo.State.RUNNING | workStatus.getState() == WorkInfo.State.ENQUEUED;
}
return running;
}
Depuis le 11 octobre (2018), vous pouvez utiliser ListenableFuture au lieu de SynchronousWorkManager qui a été supprimé:
Vous pouvez désormais obtenir et observer de manière synchrone en utilisant ListenableFutures. Par exemple, WorkManager.enqueue () utilisé pour retourner void; il renvoie maintenant un ListenableFuture. Vous pouvez appeler ListenableFuture.addListener (Runnable, Executor) ou ListenableFuture.get () pour exécuter le code une fois l'opération terminée.
Plus d'informations peuvent être trouvées ici .
Une autre option peut être d'utiliser ListenableWorker :
Une classe qui peut effectuer un travail de manière asynchrone dans WorkManager. Dans la plupart des cas, nous vous recommandons d'utiliser Worker, qui offre une API synchrone simple qui est exécutée sur un thread d'arrière-plan prédéfini.
Il renvoie ListenableFuture après avoir appelé la fonction startWork ().
Plus d'informations peuvent être trouvées ici .
Si vous utilisez Kotlin, vous pouvez écrire une fonction d'extension comme celle-ci
fun WorkManager.isAnyWorkScheduled(tag: String): Boolean {
return try {
getWorkInfosByTag(tag).get().firstOrNull { !it.state.isFinished } != null
} catch (e: Exception) {
when (e) {
is ExecutionException, is InterruptedException -> {
e.printStackTrace()
}
else -> throw e
}
false
}
}