android - WorkManager 的定期工作请求不起作用

标签 android kotlin android-workmanager

  • 我正在使用 Workmanager 在几分钟内执行任务,但它仅在第一次执行。从我的角度来看,它应该每分钟执行一次。
  • 我正在设备上进行测试,同时应用处于前台运行且电源已打开。

代码:

class MainActivity : AppCompatActivity() {

    val TAG: String = "MainActivity"
    lateinit var workLiveData: LiveData<List<WorkInfo>>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initWM()
    }

    private fun initWM() {
        val request = PeriodicWorkRequestBuilder<DemoWorker>(1, TimeUnit.MINUTES)
        .addTag(TAG)
        .build()
    
    WorkManager.getInstance(this).enqueueUniquePeriodicWork(TAG, 
        ExistingPeriodicWorkPolicy.REPLACE, request)
    }
}

演示工作人员:

class DemoWorker(
    context: Context,
    params: WorkerParameters
) : Worker(context, params) {

    val TAG: String = "MainActivity"

    override fun doWork(): Result {
        Log.d(TAG, "doWork: ")
        return try {
            Result.success(workDataOf("KEY" to "SUCCESS"))
        } catch (e: Exception) {
            Result.failure()
        }
    }
}

最佳答案

关于“最小间隔”的提醒。 WorkManager 正在平衡两个不同的要求:应用程序及其 WorkRequest,以及 Android 操作系统及其限制电池消耗的需要。因此,即使满足 WorkRequest 上设置的所有约束,您的工作仍然可以在一些额外的延迟下运行。

所以你正在替换一件又一件的作品。操作系统可能没有适当的时间来执行工作。因此最好的选择是尝试延迟 1 小时。

您可以使用 flexInterval。让我们看一个示例。假设您想要构建一个周期为 30 分钟的定期工作请求。您可以指定一个小于此时间段的 flexInterval,例如 15 分钟的 flexInterval。 使用此参数构建PeriodicWorkPequest的实际代码是:

val logBuilder = PeriodicWorkRequestBuilder<MyWorker>(
                     30, TimeUnit.MINUTES, 
                     15, TimeUnit.MINUTES)

结果是我们的worker将在周期的后半段执行(flexInterval始终位于重复周期的末尾):

关于android - WorkManager 的定期工作请求不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70587755/

相关文章:

java - 旋转旋钮在 TextView 中使用获取进度值

android - 有没有一种明智的方法来引用静态初始化程序中的应用程序资源(R.string ...)

android - 子类和父类中的 Kotlin 泛型

android - 为什么工作管理器中的 worker 仍然处于 ENQUEUED 状态?

android-jobscheduler - Oppo Realme 1 Job Scheduler 定期工作的最小间隔为 1 小时

android - Workmanager 中唯一的 OneTimeWorkRequest

android - 清空 Facebook FriendPickerFragment

java - 使用文件提供程序检索内容 URI 失败

android - 使用输入和输出验证进行单元测试

java - 如何让安卓设备振动?频率不同?