WorkManager 运行 不超过 20 个作业

WorkManager does not run more than 20 jobs

我正在排队等待未来的工作,同时 运行正在处理初始工作 "now"。在 20 个项目入队后,不再立即添加任何新项目 运行,我将不得不等待 30 天,看看它们是否 运行 ;)

在将工作项的初始延迟设置为 10 秒(允许的最小值)后,我现在已经等待了超过 24 小时。

如果我安排第 21 个作业,则什么也不会发生。 10 秒后取消第 20 个和第 21 个作业 运行 中的任何一个。 100% 可重复——重新安排作业 20,没有。取消作业 21,作业 20 将在 10 秒后 运行。

dependencies {
    implementation 'androidx.work:work-runtime:2.3.4'
}

fun scheduleTickle(context: Context, item: Item) {

    // item.id is the auto-generated primary key from the database

    val periodicWorkRequest = PeriodicWorkRequest.Builder(
        MessageWorker::class.java,
        item.minimumInterval,
        TimeUnit.DAYS
    ).let {
        it.setInputData(
            Data.Builder()
                .putLong("EXTRA_KEY_ITEM_ID", item.id)
                .build()
        )
        it.setConstraints(
            Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build()
        )
        it.addTag("com.example.myapp.periodicWork.${item.id}")
        it.setInitialDelay(10, TimeUnit.SECONDS)
    }.build()

    WorkManager.getInstance(context).enqueueUniquePeriodicWork(
        item.id.toString(),
        ExistingPeriodicWorkPolicy.REPLACE,
        periodicWorkRequest
    )
}

我要冒险了,我猜你的问题是:

How can I have more jobs?

WorkManager 将向 JobSchedulerAlarmManager 注册的最大作业数,默认情况下似乎是 20。文档有点奇怪,但默认值对于 setMaxSchedulerLimit() is MIN_SCHEDULER_LIMIT,即 20.

原则上应该可以通过the custom configuration process调整。

但是,如果我正确阅读了这些文档,则强制上限为 50 — 换句话说,您不能将高于 50 的值传递给 setMaxSchedulerLimit()

除非这些工作中的每一项都有完全独立的执行标准,否则您可以考虑尝试合并一些。例如,根据您的代码,您可以使用一个作业,其时间段为 item.minimumInterval 值的最小公分母,其中作业的一部分工作是查看您实际要做的哪些事情已准备就绪待执行。