Как отменить работу из WorkManager в Android?

Я сохранил WorkManager UUID, преобразованный в String, в базе данных Realm.

Вот код -

Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
            Data inputData = new Data.Builder().putString("downloadUrl", downloadUrl).
                    putString("destinationFolder", destinationFolder).
                    putInt("suraNumber", Integer.parseInt(suraNumber)).
                    putString("fileName", fileName).
                    putBoolean("downloadFileTypeBangla", downloadFileTypeBangla).
                    putBoolean("downloadFileTypeArabic", downloadFileTypeArabic).
                    putBoolean("downloadFileTypeArabicWithBangla", downloadFileTypeArabicWithBangla).build();
            OneTimeWorkRequest downloadWork = new OneTimeWorkRequest.Builder(DownloadWorker.class).setConstraints(constraints).setInputData(inputData).build();
            WorkManager.getInstance().enqueue(downloadWork);

            Sura sura = dbOperations.getSuraById(Integer.parseInt(suraNumber));
            if (sura != null){
                dbOperations.updateSura(sura, Integer.parseInt(suraNumber), sura.getBnAudioDownloadStatus(), sura.getArAudioDownloadStatus(), 1);
                realm.beginTransaction();
                DownloadStatusModel downloadStatusModel = new DownloadStatusModel();
                downloadStatusModel.setId(new RealmCommonService(realm).newId(DownloadStatusModel.class));
                downloadStatusModel.setDownloadFileType("ArabicWithBangla");
                downloadStatusModel.setActiveStatus(true);
                downloadStatusModel.setDownloadDate(new Date());
                downloadStatusModel.setDownloadedSuraNo(sura.getSuraNo());
                downloadStatusModel.setDownloadFileSize(sura.getArBnAudioFileSize());
                downloadStatusModel.setDownloadReferenceId(downloadWork.getId().toString());
                downloadStatusModel.setDownloadedSuraNameBangla(sura.getSuraNameBangla());
                downloadStatusModel.setDownloadStatus(1);
                realm.copyToRealm(downloadStatusModel);
                realm.commitTransaction();
            }

Теперь я пытаюсь отменить Work, используя эту строку кода, но не сработало.

WorkManager.getInstance().cancelWorkById(UUID.fromString(downloadStatusModel.getDownloadReferenceId()));

Любая помощь будет оценена

Спасибо

Попробуйте отменить работу по тегу cancelAllWorkByTag и предоставить этот же тег своему работнику. Но помните, что это работает, если ваша работа не закончена.

Jeel Vankhede 23.11.2018 06:42

Спасибо за ваш комментарий. Отменит ли он все мои работы, которые я поставил в очередь?

Al-Amin 23.11.2018 06:44

Да !, было бы. Возможно, ваша проблема не в UUID, но она уже закончена (Просто догадываюсь).

Jeel Vankhede 23.11.2018 06:45

Не повезло. cancelAllWorkByTag не работает. Моя работа также не закончена. Я это отладил.

Al-Amin 23.11.2018 07:31

Что значит «не сработало»? Как вы проверяете, что его не отменили? Получает ли ваш Worker обратный вызов onStopped()?

ianhanniballake 23.11.2018 09:20

Я имею в виду, что это не отменяли. Я скачиваю файл в рабочем классе после отмены работы, которую он продолжает скачивать. Я не тестировал, реализуя метод onStopped. Дай мне попробовать. Спасибо @ianhanniballake

Al-Amin 23.11.2018 09:28

Спасибо @ianhanniballake, это сработало.

Al-Amin 23.11.2018 09:31
4
7
8 014
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете Worker, вам необходимо переопределить метод onStopped() и использовать его как сигнал для вашего воркера, чтобы отменить его текущую работу. В вашем методе doWork() вы также можете использовать isStopped() для проверки отмены.

onStopped() является окончательным в CoroutineWorker, и в документации упоминается об использовании метода afterDone() в будущем вместе с проверкой isCancelled, однако в моем случае использования он используется в качестве долго работающего рабочего переднего плана, и я отменяю его с помощью CancellingPendingIntent. Как я могу произвести очистку внутри самого воркера?
CyberShark 06.11.2021 12:00

@CyberShark - согласно документы, ваша приостановка doWork отменяется, поэтому вы захотите обработать ее, как отмену любого другого метода приостановки, например. блок try / finally, который обеспечит выполнение блока finally независимо от того, отменены вы или нет.

ianhanniballake 06.11.2021 15:42

Другие вопросы по теме