如何解决未使用 ExistingPeriodicWorkPolicy.REPLACE 替换 WorkManager
调用 ExistingPeriodicWorkPolicy.REPLACE 只是启动另一个 workManager 它不会替换另一个,多个 workManager 在触发时正在运行而不替换
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 个相同的工作经理正在运行而不是被替换。
解决方法
以上日志并不能证明老工人没有被取消。您可以添加以下观察者通过WorkInfo
WorkManager.getInstance(context).getWorkInfosByTagLiveData(TAG)
.observe(lifecycleOwner,{ workInfo ->
workInfo.forEach {
println("Worker Info -> $it")
}
})
,
如果其他人在使用 ExistingPeriodicWorkPolicy.REPLACE 阻止工作经理时遇到问题,请致电
if (isStopped) return Result.success()
在 doWork() 中,您将获得您期望的行为。
感谢
WorkManager.getInstance().cancelAllWorkByTag() not stopping the periodic job
""一种方法是在 doWork 方法中进行一些检查,通过调用 isStopped() 来检查工作线程是否已被取消。如果 isStopped 为 true,则从方法中返回一个 Result 而不是继续其余的工作。""
和
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。