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

PPD*_*PPD 5 android android-jetpack android-workmanager

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

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);
Run Code Online (Sandbox Code Playgroud)

我在该活动中有一个活动,如果用户取消选中该复选框,则会有一个复选框,然后我想停止此作业。所以我停止了工作:

WorkManager.getInstance().cancelAllWorkByTag("wifiJob");
Run Code Online (Sandbox Code Playgroud)

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

根据文档:

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

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

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

PPD*_*PPD 11

在创建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);
Run Code Online (Sandbox Code Playgroud)

要停止工作,我正在使用:

WorkManager.getInstance().cancelAllWorkByTag("WIFIJOB1");
Run Code Online (Sandbox Code Playgroud)

  • 对于未来的读者,[方法](https://developer.android.com/reference/androidx/work/WorkManager.html#cancelUniqueWork(java.lang.String))`cancelUniqueWork(String workName)`存在!:) (4认同)

Jam*_*len 5

我相信你在这里遇到的问题在这个重复的问题中得到了回答。

总之,如果您有一个尚未启动的待处理工作线程,则该工作线程将被取消并且不会运行。但是,如果工作人员已经在运行,取消工作不会以硬方式终止工作人员 - 它只是将工作人员的状态标志设置为CANCELLED如文档中所述。由您来处理您内部的取消doWork并终止工作人员。

一种方法是在您的doWork方法中进行一些检查,以通过调用isStopped(). 如果isStopped为真,则使用 a 从方法返回,Result而不是继续其余的工作。