Я сохранил 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()));
Любая помощь будет оценена
Спасибо
Спасибо за ваш комментарий. Отменит ли он все мои работы, которые я поставил в очередь?
Да !, было бы. Возможно, ваша проблема не в UUID, но она уже закончена (Просто догадываюсь).
Не повезло. cancelAllWorkByTag не работает. Моя работа также не закончена. Я это отладил.
Что значит «не сработало»? Как вы проверяете, что его не отменили? Получает ли ваш Worker обратный вызов onStopped()?
Я имею в виду, что это не отменяли. Я скачиваю файл в рабочем классе после отмены работы, которую он продолжает скачивать. Я не тестировал, реализуя метод onStopped. Дай мне попробовать. Спасибо @ianhanniballake
Спасибо @ianhanniballake, это сработало.
Если вы используете Worker, вам необходимо переопределить метод onStopped() и использовать его как сигнал для вашего воркера, чтобы отменить его текущую работу. В вашем методе doWork() вы также можете использовать isStopped() для проверки отмены.
onStopped() является окончательным в CoroutineWorker, и в документации упоминается об использовании метода afterDone() в будущем вместе с проверкой isCancelled, однако в моем случае использования он используется в качестве долго работающего рабочего переднего плана, и я отменяю его с помощью CancellingPendingIntent. Как я могу произвести очистку внутри самого воркера?
@CyberShark - согласно документы, ваша приостановка doWork отменяется, поэтому вы захотите обработать ее, как отмену любого другого метода приостановки, например. блок try / finally, который обеспечит выполнение блока finally независимо от того, отменены вы или нет.
Попробуйте отменить работу по тегу
cancelAllWorkByTagи предоставить этот же тег своему работнику. Но помните, что это работает, если ваша работа не закончена.