我发现工作管理器(alpha-12)的这种奇怪行为是,它在排队后没有执行工作。排队工作的代码如下。
fun enqueue(phoneNumber: String?,priorityId: String? = null): ListenableFuture<WorkInfo> {
return WorkManager.getInstance().run {
val work = OneTimeWorkRequestBuilder<ContentDownloaderWork>()
.addTag(TIMESTAMP)
.setInputData(workDataOf(PHONE to phoneNumber, PRIORITY_ID to priorityId))
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.SECONDS)
.setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
.build()
beginUniqueWork(TIMESTAMP + priorityId.orEmpty(), ExistingWorkPolicy.APPEND, work).enqueue()
getWorkInfoById(work.id)
}
}
每次启动应用程序时,我都会排队这项工作。我正在做的是在从服务器下载文件的工作过程中杀死我的应用程序。每次我重新打开应用程序后,它都会成功重新启动,但次数有限。
似乎它已经充满了某种队列,并且不允许将更多的作业排入队列。当我通过标签检查所有可用的作业时,它表明有些作业已被取消而某些作业成功了,但是当我尝试加入新工作时却什么也没做。
那么这是工作管理器中的错误还是我做错了什么?
答案 0 :(得分:0)
说明中缺少的一个重要信息是这些测试中使用的Android版本。
WorkManager使用Android Marshmallow(6.0,API级别23)及更高版本上的JobScheduler API来计划工作人员,并且它会在任何时候(default is 20,maximum is 50)使用该API计划最大数量的工作人员。您看到的阈值可能与此值相关。
另一个重要的一点是,WorkManager会为您跟踪工作程序,因此,如果在工作程序运行时终止了应用程序,WorkManager会自动重新启动工作程序。您无需执行任何操作。
我不清楚,您是想在每次应用程序启动时实现附加新作业的目的。
最后一点,1秒的退避标准对我来说有点激进。 The current default value, looking into the source code, is 30 seconds and the maximum is 5 hours。
但是,如果您认为有问题(或记录错误),建议您打开WorkManager's public issuetracker上的错误。