【问题标题】:WorkManager setRequiresDeviceIdle is confusingWorkManager setRequiresDeviceIdle 令人困惑
【发布时间】:2019-02-18 11:03:02
【问题描述】:

我已经实施了计划工作管理器。我的想法是每 2 小时完成一个过程。但我需要保证执行。根据工作经理的文档,每个排队的进程都将得到保证。

但现在这个 setRequiresDeviceIdle 让我感到困惑。文档中说明默认情况下 setRequiresDeviceIdle 已设置为 false。所以我假设如果设备处于空闲模式,我的进程将无法工作。

和空闲模式 = 当手机屏幕关闭一段时间。

但如果我将此 setRequiresDeviceIdle 设置为 true。我假设现在它只会在设备处于空闲模式时工作。

即使设备处于空闲状态或未处于空闲状态,我也希望进程完成。我现在该怎么办?

【问题讨论】:

  • 此方法的默认约束为 false,这意味着您的工作将特别运行,传递 true 将限制该条件。所以,一旦 ture,意味着工作只会在空闲状态下运行。
  • 这对我来说几乎没问题,我的问题是在各种条件下运行?闲而不闲。如何实现这种行为?

标签: android android-workmanager workmanagers


【解决方案1】:

如果你通过WorkManager Docs,你会发现:

requiresDeviceIdle boolean: true 如果设备必须空闲才能运行工作

如果您通过true,则表示您的工作将仅在设备位于idle state时执行。

正如您所提到的,您希望始终执行您的任务。因此,您应该在setRequiresDeviceIdle() 中传递false。

注意:您的任务不一定会在 2 小时后执行。根据DOCS,您的任务可能会推迟到下一个maintenance window。您的任务肯定会执行,但持续时间不会正好是 2 小时。可能还不止这些。

在打盹模式下,系统会尝试通过限制应用访问网络和 CPU 密集型服务来节省电池电量。它还可以阻止应用访问网络并推迟其作业、同步和标准警报。

系统会定期退出 Doze 短暂的时间,以让应用完成其延迟的活动。在此维护时段内,系统会运行所有挂起的同步、作业和警报,并允许应用访问网络。

如果您不想始终在准确的时间执行您的任务,您可以使用Alarm Manager 和setExactAndAllowWhileIdle()。 但不鼓励这种做法,因为它不利于电池性能。

【讨论】:

  • 抱歉,但我从您的回复中看到了混杂的信息。在第一部分中,我感觉到工作人员会在设备处于打盹模式时运行(“仅在设备处于空闲状态时执行”)。但在第二部分,我感觉到它只会在维护窗口中运行。因此,假设我希望我的周期性工作器在打盹模式下大约每 15 分钟运行一次。我无法理解setRequiresDeviceIdle() 是否可行
  • @JHowzersetRequiresDeviceIdle() 与doze mode 完全不同。它们不相关。如果设置setRequiresDeviceIdle(true),那么只有当设备为idle时才会执行任务。而setRequiresDeviceIdle(false) can 将执行任务,即使应用程序正在运行或未处于待机状态。 “空闲”被认为是打盹模式处于活动状态的时间
  • 回到您的问题,您的用例可以使用setRequiresDeviceIdle()。唯一的问题是周期时间不会正好是 15 分钟。维护窗口是打盹模式的一部分,所有延迟的任务都捆绑在一起并执行。
  • 这也让我很困惑。对我来说,setRequiresDeviceIdle(true) 会产生利益冲突:它是说您希望作业仅在设备决定是时候进入空闲状态时运行...... 想从事任何工作吗?
  • 设备何时空闲?定义是什么?
猜你喜欢
  • 2022-01-21
  • 2022-01-17
  • 2018-02-26
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
相关资源
最近更新 更多