首页 > 解决方案 > 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" 杀死进程,半小时后任务仍然执行良好,有没有人知道为什么设置为长时间时它会丢失?

标签: androidkotlin-coroutinesworkerandroid-workmanager

解决方案


“不能长时间工作”不是你的问题。尝试调试作业调度程序。由于 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 小时的弹性周期工作,你就完成了。


推荐阅读