【问题标题】:WorkManager.getInstance().cancelAllWorkByTag() not stopping the periodic jobWorkManager.getInstance().cancelAllWorkByTag() 不停止定期作业
【发布时间】:2018-09-07 08:19:27
【问题描述】:

对于定期任务,我将工作经理用作:

PeriodicWorkRequest.Builder wifiWorkBuilder =
                            new PeriodicWorkRequest.Builder(FileUpload.class, 15,
                                    TimeUnit.MINUTES)
                                    .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.METERED).build());
                    PeriodicWorkRequest wifiWork = wifiWorkBuilder.build();
                    WorkManager.getInstance().enqueueUniquePeriodicWork("wifiJob", ExistingPeriodicWorkPolicy.REPLACE, wifiWork);

我在该活动中有一个活动,如果用户取消选择复选框,则存在一个复选框,然后我想停止这项工作。所以我停止了这样的工作:

WorkManager.getInstance().cancelAllWorkByTag("wifiJob");

但是在停止工作之后,我的任务也在执行。以前我认为可能是下一个作业将被执行,之后它将停止,但在过去的 1 小时内它执行了 4 次并且作业仍在后台运行。什么是停止工作的其他方式或正确方式。

根据文档:

使用给定标签取消所有未完成的工作。请注意,取消是一项尽力而为的政策,已经执行的工作可能会继续运行。

这是什么意思 - 取消是一项尽力而为的政策,已经执行的工作可能会继续运行。那么阻止这种情况的正确方法是什么

我正在使用版本implementation "android.arch.work:work-runtime:1.0.0-alpha08" 在此先感谢

【问题讨论】:

    标签: android android-jetpack android-workmanager


    【解决方案1】:

    在创建 PeriodicWorkRequest 时,我添加了 addTag() 并取消使用相同标签名称的任务,使用它取消挂起的工作。所以我的代码是这样的:

    PeriodicWorkRequest.Builder wifiWorkBuilder =
                                new PeriodicWorkRequest.Builder(FileUpload.class, 15,
                                        TimeUnit.MINUTES)
                                        .addTag("WIFIJOB1")
                                        .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.METERED).build());
                        wifiWork = wifiWorkBuilder.build();
                        WorkManager.getInstance().enqueueUniquePeriodicWork("wifiJob", ExistingPeriodicWorkPolicy.REPLACE, wifiWork);
    

    停止我正在使用的工作:

    WorkManager.getInstance().cancelAllWorkByTag("WIFIJOB1");
    

    【讨论】:

    • 对于未来的读者,the method cancelUniqueWork(String workName) 存在! :)
    • @varun 在 cancelUniqueWork() 中使用的 workerName 是什么?
    • @roghayeh hosseini 哦,使用您在使用beginUniqueWork(String uniqueWorkName, ...) 方法创建它时提供的名称。
    • getInstance() 已弃用。现在需要使用 getInstance(context)
    • cancelAllWork() 也存在。在大多数情况下,这对我有帮助。这将停止所有剩余的工作人员。
    【解决方案2】:

    我相信您在这里遇到的问题已在此duplicate question 中得到解答。

    总而言之,如果您有一个尚未启动的待处理工作程序,则该工作程序将被取消并且不会运行。然而如果工人已经在运行,取消工作不会以硬方式终止工人 - 它只是将工人的状态标志设置为CANCELLEDas explained in the docs。您可以自行处理 doWork 内部的取消并终止工作人员。

    执行此操作的一种方法是通过调用isStopped() 在您的doWork 方法中进行一些检查,以检查工作人员是否已被取消。如果isStopped 为真,则使用Result 从方法返回,而不是继续其余的工作。

    【讨论】:

      【解决方案3】:

      我一直在查看官方的 Android 文档:https://developer.android.com/reference/androidx/work/WorkManager

      WorkManager 支持两种类型的工作:OneTimeWorkRequestPeriodicWorkRequest

      您可以使用 WorkManager 将请求排入队列,如下所示:

       WorkManager workManager = WorkManager.getInstance();
       workManager.enqueue(new OneTimeWorkRequest.Builder(FooWorker.class).build());
      

      WorkRequest 有一个关联的 id,可用于查找和观察,如下所示:

      WorkRequest request = new OneTimeWorkRequest.Builder(FooWorker.class).build();
       workManager.enqueue(request);
       LiveData<WorkStatus> status = workManager.getStatusById(request.getId());
       status.observe(...);
      

      也可以使用id取消:

      WorkRequest request = new OneTimeWorkRequest.Builder(FooWorker.class).build();
       workManager.enqueue(request);
       workManager.cancelWorkById(request.getId());
      

      在这里您可以看到取消排队工作的不同方法:

      也许您也可以尝试使用作业的状态来取消排队或阻塞的作业:

      WorkStatus workStatus = WorkManager.getInstance().getStatusById(wifiWork.getId()).getValue();
              if(workStatus.getState() == State.ENQUEUED || workStatus.getState() == State.BLOCKED){
                  WorkManager.getInstance().cancelWorkById(wifiWork.getId());
      
              }
      

      希望对你有帮助。

      【讨论】:

      • 感谢回复,我想每 15 分钟上传一次文件,因此我使用了 PeriodicWorkRequest。但是使用复选框用户可以随时取消上传文件。因此,要取消此操作,我正在使用 cancelAllWorkByTag () 并粘贴在创建任务时使用的相同标签。但它没有被取消挂起的任务
      • 我使用 WorkStatus 编辑了带有新建议的代码
      • 您好用你的新代码测试过,但有时它仍然不能停止工作
      • 嗨。我将在这个周末进行测试,如果我找到可以解决的问题,我会告诉你
      猜你喜欢
      • 2018-07-19
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-08
      • 2016-12-17
      相关资源
      最近更新 更多