为什么在使用WorkManager的OneTimeWorkRequest的setInitialDelay()函数时,更改设备时间后延迟不会生效?

4

我想使用 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。

1个回答

0

您使用了TimeUnit.SECONDSsetInitialDelay,但是getDelayTime却使用毫秒。

这可能导致问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接