web-dev-qa-db-fra.com

Vérifiez si WorkManager est déjà planifié

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?

9
Khemraj

Mise à jour

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);
  • Où TAG est le nom unique sous lequel le gestionnaire de travaux vérifiera la duplication.
  • Vous pouvez choisir entreExistingPeriodicWorkPolicy.KEEP Et ExistingPeriodicWorkPolicy.REPLACE.

Poste d'Orignal

J'ai créé cette méthode quand je n'en ai pas trouvé.

Vérifiez si le travail est exécuté par TAG

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.

Exemple de code

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

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;
}
2
Irfan

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 .

2
David Sucharda

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
    }
}
1
Abhishek