对于定期任务,我使用的是工作经理:
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"
先谢谢
在创建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");
我一直在检查官方的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());
在这里,您可以看到取消排队作业的不同方法:
也许您也可以尝试使用作业状态取消已排队或已阻止的作业:
WorkStatus workStatus = WorkManager.getInstance().getStatusById(wifiWork.getId()).getValue();
if(workStatus.getState() == State.ENQUEUED || workStatus.getState() == State.BLOCKED){
WorkManager.getInstance().cancelWorkById(wifiWork.getId());
}
我希望它对你有所帮助。