- 我正在使用
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/