如何在Android中取消WorkManager中的工作?

7

我已经将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
谢谢你的评论。它会取消我已经排队的所有任务吗? - Al-Amin
1
你说的“它没起作用”是什么意思?你是怎么确认它没有被取消的?你的Worker是否收到了onStopped()回调函数? - ianhanniballake
我的意思是它并没有被取消。在取消工作后,我正在工作类中下载文件,它仍然在下载。我没有通过实现onStopped方法进行测试。让我试一下。谢谢@ianhanniballake - Al-Amin
谢谢 @ianhanniballake,它起作用了。 - Al-Amin
显示剩余2条评论
1个回答

12

如果您正在使用 Worker ,则需要覆盖 onStopped() 方法,并将其用作信号,以取消正在进行的工作。在您的 doWork() 方法中,您还可以使用 isStopped() 检查是否取消。


1
onStopped()CoroutineWorker 中是 final 的,文档提到要在 future 上使用 afterDone() 方法以及一个 isCancelled 检查,但在我的用例中,我将其作为前台长时间运行的 worker,并使用 CancellingPendingIntent 进行取消。如何在 worker 本身内进行清理? - CyberShark
2
@CyberShark - 根据文档,您的暂停doWork会被取消,因此您需要像处理任何其他暂停方法一样处理它的取消,例如使用try/finally块,确保无论您是否被取消,最终块都会运行。 - ianhanniballake
cancelUniqueWork 对我的 CoroutineWorker 无效,它仍会执行从 doWork 函数调用的所有代码行。 - user924
@user924 - 它确实有影响,只需记住协程取消是协作的。如果您没有使用暂停方法(提供自动取消点)或检查isActive,则您在代码中没有正确处理取消。这与cancelUniqueWork无法正常工作无关。 - ianhanniballake
@ianhanniballake,您所说的“不使用挂起方法”是什么意思?在CoroutineWorker中有suspend fun doWork()...在cancelUniqueWork之后,即使在代码执行期间多次检查,函数isStopped()仍然返回false。 - user924
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接