android - Workmanager OneTimeWorkRequestBuilder 在 setInitialDelay 中无法长时间工作
问题描述
我每天午夜使用 Workmanager 执行一项操作,我正在使用它:
val duration = midNight.time - now.time
val workRequest =
OneTimeWorkRequestBuilder<ActionWorker>()
.setInitialDelay(duration, TimeUnit.MILLISECONDS)
.build()
WorkManager.getInstance(context)
.enqueueUniqueWork(
WORKER_ID,
ExistingWorkPolicy.REPLACE,
workRequest
)
在 ActionWorker doWork 中,我写入 sharedpreferences,问题是当持续时间相对较短(如 2 到 5 小时)时,动作会完美执行,否则如果持续时间设置为 12 小时,则不会执行动作。我将持续时间设置为半小时,我尝试使用 adb shell am kill "package name" 杀死进程,半小时后任务仍然执行良好,有没有人知道为什么设置为长时间时它会丢失?
解决方案
“不能长时间工作”不是你的问题。尝试调试作业调度程序。由于 WorkManager 在下面使用作业:
https://developer.android.com/topic/libraries/architecture/workmanager/how-to/debugging
执行:
adb shell dumpsys 作业调度程序
并检查:
未满足的约束:TIMING_DELAY CONNECTIVITY [0x90000000]
如果TIMING_DELAY得到满足,我相信它会满足 - 可能有其他原因导致工作未执行。Android 有很多限制,例如每 24 小时可以执行多少次工作或允许您使用多少网络。在这里检查:
https://developer.android.com/topic/performance/power/power-details
你也确定你想要达到的目标吗?为什么每天晚上?查看:
https://developer.android.com/reference/androidx/work/Constraints.Builder
一般来说,这个想法是让您选择条件 - 空闲/非空闲设备、Wi-Fi/无 Wi-Fi、充电/未充电、低电量/非低电量,然后 Android 将决定何时执行。如果有与服务器端要求相关的东西,我会得到它。但除此之外,我不会。
然后你设定要求,把一个周期为 24 小时的周期性工作和一些2-3 小时的弹性周期工作,你就完成了。
推荐阅读
- installation - 复制谷歌colab的python环境的最佳方法
- python-3.x - 测试尝试 - 捕获 Django 函数。需要异常测试
- javascript - 为什么我在带有 JavaScript 日期的不同编译器中得到不同的输出?
- python-3.x - 在 google colab 中运行显示图像的 python 文件
- html - 如何在单个图像周围添加边框,同时保持图像并排对齐?
- c++ - 努力让 pprof 产生任何输出
- r - 将数据框列转换为列表
- python - 如何打印为整数而不是浮点数
- node.js - 如何正确扩展 @elastic/elasticsearch 以使用 aws4 签署请求?
- python - 在 Python 中创建两个列表的压缩列表,但允许从一个列表到另一个列表重复