首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未使用ExistingPeriodicWorkPolicy.REPLACE替换WorkManager

未使用ExistingPeriodicWorkPolicy.REPLACE替换WorkManager
EN

Stack Overflow用户
提问于 2021-05-01 03:46:55
回答 2查看 117关注 0票数 1

调用ExistingPeriodicWorkPolicy.REPLACE只是启动另一个workManager,它不会替换另一个,触发时多个workManagers正在运行,而不是替换

代码语言:javascript
复制
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)

日志显示,作业管理器至少要求取消,但执行仍在继续

代码语言:javascript
复制
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)

我已经将一个监听器附加到工作管理器,日志是

代码语言:javascript
复制
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

监听程序是:

代码语言:javascript
复制
val instance = WorkManager.getInstance(requireContext())
  instance.getWorkInfosForUniqueWorkLiveData(SongsWorkerManager.TAG)
        .observe(viewLifecycleOwner) { workInfo ->
            workInfo.forEach {
                Log.d(TAG, "ID = ${it.id}")
            }
        }

触发工作管理器3次后,3个相同的工作管理器正在运行,而不是被替换。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-03 17:02:44

如果其他任何人在使用ExistingPeriodicWorkPolicy.REPLACE阻止工作管理器时遇到问题,请调用

代码语言:javascript
复制
if (isStopped) return Result.success()

在doWork()中,你会得到你所期望的行为。

感谢

WorkManager.getInstance().cancelAllWorkByTag() not stopping the periodic job

“”要做到这一点,一种方法是通过调用isStopped()在doWork方法中添加一些检查,以检查工作进程是否已被取消。如果isStopped为true,则从该方法返回一个结果,而不是继续其余的工作。“”

How to make sure that WorkManager cancels my Worker?

票数 1
EN

Stack Overflow用户

发布于 2021-05-01 05:51:47

上面的日志并不能证明老工人没有被取消。您可以添加以下观察者,通过WorkInfo查看所有工作进程的当前状态

代码语言:javascript
复制
WorkManager.getInstance(context).getWorkInfosByTagLiveData(TAG)
            .observe(lifecycleOwner, { workInfo ->
                workInfo.forEach { 
                    println("Worker Info -> $it")
                }
            })
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67339658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档