我想使用 WorkManager 每天从午夜开始每 24 小时更新数据库。
首先,我知道 WorkManager 的 PeriodicWorkRequest 并没有指定 worker 应该在什么时间运行。
因此,我使用了 OneTimeWorkRequest() 来设置延迟,然后将 PeriodicWorkRequest() 放入队列中,使其每 24 小时运行一次。
1. 约束
private fun getConstraints(): Constraints {
return Constraints.Builder()
.setRequiredNetworkType(NetworkType.NOT_REQUIRED)
.build()
}
2.OneTimeWorkRequest
fun applyMidnightWorker() {
val onTimeDailyWorker = OneTimeWorkRequest
.Builder(MidnightWorker::class.java)
.setInitialDelay(getDelayTime(), TimeUnit.SECONDS)
.setConstraints(getConstraints())
.build()
val workerContinuation =
workManager.beginUniqueWork(Const.DAILY_WORKER_TAG,
ExistingWorkPolicy.KEEP,
onTimeDailyWorker)
workerContinuation.enqueue()
}
getDelayTime() 的作用是
private fun getDelayTime(): Long {
...
return midNightTime - System.currentTimeMillis()
}
3. MidnightWorker类
class MidnightWorker : Worker() {
override fun doWork(): Result {
DailyWorkerUtil.applyDailyWorker()
return Worker.Result.SUCCESS
}
}
4.PeriodicWorkRequest
fun applyDailyWorker() {
val periodicWorkRequest = PeriodicWorkRequest
.Builder(DailyWorker::class.java, 24, TimeUnit.HOURS)
.addTag(Const.DAILY_WORKER)
.setConstraints(getConstraints()).build()
workManager.enqueue(periodicWorkRequest)
}
我确认延迟时间已过,午夜工作者正在运行。
当然,它正常工作并不涉及网络的任何关系。
然而,测试结果表明,延迟时间无论设备时间如何都有效,就像它是服务器时间一样。
这是我的问题:
1. 根据设备时间没有延迟。我想知道延迟是否按照服务器时间标准工作。
2. 我想知道PeriodicWorkRequest是否可以提供类似OneTimeWorkRequest的InitialDelay。