WorkManager.getInstance (). CancelAllWorkByTag () не останавливает периодическое задание - PullRequest
0 голосов
/ 07 сентября 2018

для периодического задания я использую менеджер работ как:

PeriodicWorkRequest.Builder wifiWorkBuilder =
                            new PeriodicWorkRequest.Builder(FileUpload.class, 15,
                                    TimeUnit.MINUTES)
                                    .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.METERED).build());
                    PeriodicWorkRequest wifiWork = wifiWorkBuilder.build();
                    WorkManager.getInstance().enqueueUniquePeriodicWork("wifiJob", ExistingPeriodicWorkPolicy.REPLACE, wifiWork);

У меня есть одно действие в этом задании, есть один флажок, если пользователь снимает флажок, то я хочу остановить это задание. Поэтому я прекращаю работу, как:

WorkManager.getInstance().cancelAllWorkByTag("wifiJob");

Но после прекращения работы моя задача также выполняется. Ранее я думал, что может быть выполнено следующее задание, и после этого оно остановится, но за последний час оно выполнено 4 раза, а задание все еще выполняется в фоновом режиме. Какой другой способ или правильный способ прекратить работу.

согласно Документам:

Отменяет всю незаконченную работу с данным тегом. Обратите внимание, что отмена - это политика с максимальными усилиями, и работа, которая уже выполняется, может продолжаться.

В чем смысл этого - отмена - это политика наилучшего усилия, и работа, которая уже выполняется, может продолжаться. Итак, как правильно остановить это

Я использую версию implementation "android.arch.work:work-runtime:1.0.0-alpha08" Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

При создании PeriodicWorkRequest я добавил addTag () и для отмены задачи использовал то же имя тега, что и отменяет ожидающую работу. Мой код выглядит так:

PeriodicWorkRequest.Builder wifiWorkBuilder =
                            new PeriodicWorkRequest.Builder(FileUpload.class, 15,
                                    TimeUnit.MINUTES)
                                    .addTag("WIFIJOB1")
                                    .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.METERED).build());
                    wifiWork = wifiWorkBuilder.build();
                    WorkManager.getInstance().enqueueUniquePeriodicWork("wifiJob", ExistingPeriodicWorkPolicy.REPLACE, wifiWork);

Чтобы остановить работу, я использую:

WorkManager.getInstance().cancelAllWorkByTag("WIFIJOB1");
0 голосов
/ 04 июля 2019

Я полагаю, что проблема, с которой вы здесь столкнулись, решена в этом дублированном вопросе .

В итоге, если у вас есть ожидающий работник, который еще не запущен, он будет отменен и не будет работать. Однако , если работник уже выполняет , отмена работы не приводит к жесткому завершению работы работника - он просто устанавливает флаг состояния работника на CANCELLED, , как описано в документации * 1009. *. От вас зависит обработка отмены внутри вашего doWork и увольнение работника.

Один из способов сделать это - добавить несколько проверок в ваш метод doWork, чтобы проверить, был ли работник отменен, вызвав isStopped(). Если isStopped истинно, вернитесь из метода с Result вместо продолжения оставшейся части работы.

0 голосов
/ 07 сентября 2018

Я проверял официальные документы по Android: https://developer.android.com/reference/androidx/work/WorkManager

WorkManager поддерживает два типа работы: OneTimeWorkRequest и PeriodicWorkRequest .

Вы можете ставить запросы в очередь с помощью WorkManager следующим образом:

 WorkManager workManager = WorkManager.getInstance();
 workManager.enqueue(new OneTimeWorkRequest.Builder(FooWorker.class).build());

WorkRequest имеет связанный идентификатор, который можно использовать для поиска и наблюдения следующим образом:

WorkRequest request = new OneTimeWorkRequest.Builder(FooWorker.class).build();
 workManager.enqueue(request);
 LiveData<WorkStatus> status = workManager.getStatusById(request.getId());
 status.observe(...);

Вы также можете использовать идентификатор для отмены:

WorkRequest request = new OneTimeWorkRequest.Builder(FooWorker.class).build();
 workManager.enqueue(request);
 workManager.cancelWorkById(request.getId());

И здесь вы можете увидеть различные способы отменить поставленную в очередь работу:

enter image description here

Возможно, вы также можете попытаться отменить поставленную в очередь или заблокированную работу, используя состояние задания:

WorkStatus workStatus = WorkManager.getInstance().getStatusById(wifiWork.getId()).getValue();
        if(workStatus.getState() == State.ENQUEUED || workStatus.getState() == State.BLOCKED){
            WorkManager.getInstance().cancelWorkById(wifiWork.getId());

        }

Надеюсь, это поможет вам.

...