Workmanager不会使用APPEND策略执行唯一作业

时间:2018-12-10 19:42:23

标签: android kotlin android-jetpack android-workmanager

我发现工作管理器(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)
    }
}

每次启动应用程序时,我都会排队这项工作。我正在做的是在从服务器下载文件的工作过程中杀死我的应用程序。每次我重新打开应用程序后,它都会成功重新启动,但次数有限。

似乎它已经充满了某种队列,并且不允许将更多的作业排入队列。当我通过标签检查所有可用的作业时,它表明有些作业已被取消而某些作业成功了,但是当我尝试加入新工作时却什么也没做。

那么这是工作管理器中的错误还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

说明中缺少的一个重要信息是这些测试中使用的Android版本。
WorkManager使用Android Marshmallow(6.0,API级别23)及更高版本上的JobScheduler API来计划工作人员,并且它会在任何时候(default is 20maximum 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上的错误。