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

Al-*_*min 3 android realm android-workmanager

我已经将 WorkManagerUUID转换为StringRealm 数据库。

这是代码 -

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();
            }
Run Code Online (Sandbox Code Playgroud)

现在我试图取消Work使用这行代码,但没有奏效。

WorkManager.getInstance().cancelWorkById(UUID.fromString(downloadStatusModel.getDownloadReferenceId()));
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激

谢谢

ian*_*ake 7

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

  • @Cyber​​Shark - 根据[文档](https://developer.android.com/topic/libraries/architecture/workmanager/advanced/coroutineworker),您的暂停`doWork`被取消,所以您想像这样处理它取消任何其他挂起方法,例如 try/finally 块,该块将确保无论您是否被取消,finally 块都会运行。 (2认同)