【问题标题】:WorkManager calls doWork() method more than once when device is LockedWorkManager 在设备被锁定时多次调用 doWork() 方法
【发布时间】:2024-01-30 05:00:02
【问题描述】:

我正在尝试执行每 15 分钟运行一次的后台同步。下面是我的同步发生的 WorkManager 初始化:

PeriodicWorkRequest syncRequest = new PeriodicWorkRequest.Builder(MyWorkerClass.class, 15, TimeUnit.MINUTES).addTag("sync").build();
WorkManager.getInstance().enqueueUniquePeriodicWork("sync", ExistingPeriodicWorkPolicy.REPLACE, syncRequest);

但是当我的设备被锁定时,由于某些原因,这种同步会发生两次,直到设备被解锁。一旦设备解锁并启动应用程序,即使此同步触发两次,但从下一次同步开始它工作正常。

我使用的设备是在 Nougat 上运行的 TC25 Zebra

在我的 app.gradle 文件中使用的依赖项:

implementation "android.arch.work:work-runtime:1.0.1"

谁能建议避免重复调用的最佳方法。

【问题讨论】:

  • 你在哪里排队你的工作请求?
  • 此外,WorkManager 在 v2.x 分支的最新稳定版本中添加了许多错误修复。这需要转移到androidx
  • 如果您对使用ExistingPeriodicWorkPolicy.REPLACE没有特殊要求,我建议您使用ExistingPeriodicWorkPolicy.KEEP,这样可以避免停止可能已经运行的worker来替换它。
  • 我已经尝试过 KEEP 和 REPLACE ,但没有任何区别。当设备被锁定时,它无论如何都会触发两次。
  • 另外,我无法迁移到 androidx,因为我的 targetSDK 版本是 26。

标签: java android android-workmanager background-service


【解决方案1】:

您需要正确处理onStopped 回调并合作停止您的工作。否则你肯定会看到你的Worker 的多个实例同时运行。

【讨论】:

  • 如果它是一个定期请求,那么为什么我需要在 onStopped 方法()中停止我的工作。