调用ExistingPeriodicWorkPolicy.REPLACE只是启动另一个workManager,它不会替换另一个,触发时多个workManagers正在运行,而不是替换
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val workRequest = PeriodicWorkRequestBuilder<SongsWorker>(1, TimeUnit.DAYS)
.addTag(TAG)
.setConstraints(constraints)
.build()
WorkManager.getInstance(mContext).enqueueUniquePeriodicWork(
TAG, ExistingPeriodicWorkPolicy.REPLACE, workRequest)日志显示,作业管理器至少要求取消,但执行仍在继续
I/WM-WorkerWrapper: Work [ id=6ed5487e-5d7b-4db5-a4c5-c22c562567e5, tags={
workerManagers.songs.SongsWorkerManager$SongsWorker } ] was cancelled
java.util.concurrent.CancellationException: Task was cancelled.
at androidx.work.impl.utils.futures.AbstractFuture.cancellationExceptionWithCause(AbstractFuture.java:1184)
at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:514)
at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:300)
at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)我已经将一个监听器附加到工作管理器,日志是
2021-04-30 20:40:54.318 17868-17868 Fragment: ID = 9f8b3165-fc75-4f9a-ba39-41c2dc6a17b3
2021-04-30 20:40:54.408 17868-17868 Fragment: ID = 9f8b3165-fc75-4f9a-ba39-41c2dc6a17b3
2021-04-30 20:40:54.427 17868-17868 Fragment: ID = 9f8b3165-fc75-4f9a-ba39-41c2dc6a17b3监听程序是:
val instance = WorkManager.getInstance(requireContext())
instance.getWorkInfosForUniqueWorkLiveData(SongsWorkerManager.TAG)
.observe(viewLifecycleOwner) { workInfo ->
workInfo.forEach {
Log.d(TAG, "ID = ${it.id}")
}
}触发工作管理器3次后,3个相同的工作管理器正在运行,而不是被替换。
发布于 2021-05-03 17:02:44
如果其他任何人在使用ExistingPeriodicWorkPolicy.REPLACE阻止工作管理器时遇到问题,请调用
if (isStopped) return Result.success()在doWork()中,你会得到你所期望的行为。
感谢
WorkManager.getInstance().cancelAllWorkByTag() not stopping the periodic job
“”要做到这一点,一种方法是通过调用isStopped()在doWork方法中添加一些检查,以检查工作进程是否已被取消。如果isStopped为true,则从该方法返回一个结果,而不是继续其余的工作。“”
和
发布于 2021-05-01 05:51:47
上面的日志并不能证明老工人没有被取消。您可以添加以下观察者,通过WorkInfo查看所有工作进程的当前状态
WorkManager.getInstance(context).getWorkInfosByTagLiveData(TAG)
.observe(lifecycleOwner, { workInfo ->
workInfo.forEach {
println("Worker Info -> $it")
}
})https://stackoverflow.com/questions/67339658
复制相似问题