【问题标题】:Workmanager does not execute unique jobs with APPEND policyWorkmanager 不使用 APPEND 策略执行唯一作业
【发布时间】:2018-12-10 19:42:23
【问题描述】:

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

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

它似乎有某种队列被填满并且不允许任何更多的作业入队。当我按标签检查所有可用作业时,它显示有些已取消,有些已成功,但是当我尝试将新工作排入队列时,它什么也不做。

那么这是 workmanager 中的错误还是我做错了什么?

【问题讨论】:

  • 你的工人有没有返回Result.failure()?因为无法追加失败的工作链。
  • @ianhanniballake 不,要么重试,要么成功。但是如果应用进程被杀死,会存储什么结果呢?

标签: android kotlin android-jetpack android-workmanager


【解决方案1】:

您的描述中缺少的一个重要信息是您在这些测试中使用的 Android 版本。
WorkManager 在 Android Marshmallow(6.0,API 级别 23)和更高版本上使用 JobScheduler API 调度工作人员,并且它在任何时候使用此 API 调度最大数量的工作人员(default is 20maximum is 50)。您看到的阈值可能与此值有关。

另一个重要的一点是,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. 上打开一个错误,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    相关资源
    最近更新 更多