代码之家  ›  专栏  ›  技术社区  ›  PPD

WorkManager.getInstance().cancelAllWorkByTag()不停止定期作业

  •  1
  • PPD  · 技术社区  · 7 年前

    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");
    

    根据文件:

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

    这是什么意思-取消是一个尽力而为的政策和工作,已经执行可能会继续运行。那么,怎样才能阻止这种情况呢

    implementation "android.arch.work:work-runtime:1.0.0-alpha08"

    2 回复  |  直到 7 年前
        1
  •  20
  •   PPD    7 年前

    在创建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");
    
        2
  •  3
  •   James Allen    7 年前

    duplicate question .

    如果辅助进程已在运行 CANCELLED , as explained in the docs doWork 终止工人。

    一种方法是在你的电脑里放几张支票 嫁妆 isStopped() . 如果 isStopped Result

        3
  •  0
  •   Juanjo Berenguer    7 年前

    我查了Android官方文档: https://developer.android.com/reference/androidx/work/WorkManager

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

    您可以使用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());
    

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

    enter image description here

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

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

    希望对你有帮助。