【问题标题】:How to cancel Work from WorkManager in Android?如何从 Android 中的 WorkManager 取消工作?
【发布时间】:2018-11-23 05:34:37
【问题描述】:

我已将 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 取消工作,并为您的员工提供相同的标签。但请记住,如果您的工作未完成,它会起作用。
  • 感谢您的评论。它会取消我已入队的所有作品吗?
  • 是的!会的。可能您的问题与 UUID 无关,但它已经完成 (只是猜测)
  • 不走运。 cancelAllWorkByTag 不起作用。我的工作也没有完成。我已经调试过了。
  • “它没有用”是什么意思?你如何检查它没有被取消?你的Worker 有没有回调到onStopped()

标签: android realm android-workmanager


【解决方案1】:

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

【讨论】:

  • onStopped()CoroutineWorker 中是最终的,并且文档提到在未来使用afterDone() 方法以及isCancelled 检查,但是在我的用例中,我将其作为前台长时间运行的工作人员,正在使用 CancellingPendingIntent 取消。如何在工作人员内部进行清理?
  • @Cyber​​Shark - 根据the docs,您的暂停doWork 被取消,因此您希望像取消任何其他暂停方法一样处理它,例如一个 try/finally 块,无论您是否被取消,都会确保 finally 块运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多