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

问题描述 投票:1回答:2

对于定期任务,我使用的是工作经理:

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
2个回答
5
投票

在创建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");

0
投票

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

WorkManager支持两种类型的工作:OneTimeWorkRequest和PeriodicWorkRequest。

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

        }

我希望它对你有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.