WorkManager.getInstance().cancelAllWorkByTag() 不停止定期作业
WorkManager.getInstance().cancelAllWorkByTag() not stopping the periodic job
对于周期性任务,我将工作管理器用作:
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);
我有一个 activity 在 activity 那里有一个复选框,如果用户取消选中复选框,那么我想停止这项工作。所以我停止了这样的工作:
WorkManager.getInstance().cancelAllWorkByTag("wifiJob");
但是在停止作业后我的任务也在执行。以前我认为可能会执行下一个作业,然后它会停止,但在过去的 1 小时内它执行了 4 次并且作业仍在后台 运行ning。停止工作的其他方法或正确方法是什么。
根据文档:
Cancels all unfinished work with the given tag. Note that cancellation is a best-effort policy and work that is already executing may continue to run.
这是什么意思 - 取消是一项尽力而为的政策,已经在执行的工作可能会继续 运行。那么停止这种情况的正确方法是什么
我使用的是版本implementation "android.arch.work:work-runtime:1.0.0-alpha08"
提前致谢
我一直在查看官方 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());
}
希望对你有所帮助
在创建 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");
我相信您在这里遇到的问题在 中得到了解答。
总而言之,如果您有一个尚未启动的挂起工作程序,该工作程序将被取消,而不会 运行。但是如果工作人员已经运行宁,取消工作不会以硬方式终止工作人员 - 它只是将工作人员的状态标志设置为CANCELLED
, as explained in the docs。您可以在 doWork
中处理取消并终止 worker。
一种方法是在您的 doWork
方法中进行一些检查,通过调用 isStopped()
来检查工作程序是否已被取消。如果 isStopped
为真,return 从带有 Result
的方法开始,而不是继续其余的工作。
对于周期性任务,我将工作管理器用作:
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);
我有一个 activity 在 activity 那里有一个复选框,如果用户取消选中复选框,那么我想停止这项工作。所以我停止了这样的工作:
WorkManager.getInstance().cancelAllWorkByTag("wifiJob");
但是在停止作业后我的任务也在执行。以前我认为可能会执行下一个作业,然后它会停止,但在过去的 1 小时内它执行了 4 次并且作业仍在后台 运行ning。停止工作的其他方法或正确方法是什么。
根据文档:
Cancels all unfinished work with the given tag. Note that cancellation is a best-effort policy and work that is already executing may continue to run.
这是什么意思 - 取消是一项尽力而为的政策,已经在执行的工作可能会继续 运行。那么停止这种情况的正确方法是什么
我使用的是版本implementation "android.arch.work:work-runtime:1.0.0-alpha08"
提前致谢
我一直在查看官方 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());
}
希望对你有所帮助
在创建 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");
我相信您在这里遇到的问题在
总而言之,如果您有一个尚未启动的挂起工作程序,该工作程序将被取消,而不会 运行。但是如果工作人员已经运行宁,取消工作不会以硬方式终止工作人员 - 它只是将工作人员的状态标志设置为CANCELLED
, as explained in the docs。您可以在 doWork
中处理取消并终止 worker。
一种方法是在您的 doWork
方法中进行一些检查,通过调用 isStopped()
来检查工作程序是否已被取消。如果 isStopped
为真,return 从带有 Result
的方法开始,而不是继续其余的工作。