Android WorkManager 并发作业计数/最大值

标签 android android-jetpack android-workmanager

WorkManager 是否对同时运行的作业数量有上限?

非常简单的例子:

  • 点击按钮,创建 10 个一次性工作
  • 将它们全部排队
  • 一次运行 3 个作业,而不是预期的全部 10 个作业

class MainActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        queue.setOnClickListener {
            val jobs = mutableListOf<OneTimeWorkRequest>()

            for( i in 1..10 ) {
                jobs += OneTimeWorkRequestBuilder<MyWorker>()
                    .setInputData(workDataOf("key" to i))
                    .build()
            }

            WorkManager.getInstance().enqueue(jobs)
        }
    }
}

class MyWorker: Worker() {
    override fun doWork(): Result {
        val jobId = inputData.getInt("key", -1)

        Log.d("worker", "starting job: $jobId")

        Completable.timer(10, SECONDS).blockingGet()

        Log.d("worker", "job finished: $jobId")

        return SUCCESS
    }
}

输出:

08-30 14:03:10.392  9825  9855 D worker  : starting job: 2
08-30 14:03:10.396  9825  9856 D worker  : starting job: 3
08-30 14:03:10.400  9825  9854 D worker  : starting job: 1
08-30 14:03:20.421  9825  9855 D worker  : job finished: 2
08-30 14:03:20.421  9825  9856 D worker  : job finished: 3
08-30 14:03:20.421  9825  9854 D worker  : job finished: 1
08-30 14:03:20.442  9825  9856 D worker  : starting job: 4
08-30 14:03:20.448  9825  9854 D worker  : starting job: 5
08-30 14:03:20.450  9825  9855 D worker  : starting job: 6
08-30 14:03:30.444  9825  9856 D worker  : job finished: 4
08-30 14:03:30.449  9825  9854 D worker  : job finished: 5
08-30 14:03:30.451  9825  9855 D worker  : job finished: 6
08-30 14:03:30.474  9825  9856 D worker  : starting job: 7
08-30 14:03:30.477  9825  9855 D worker  : starting job: 8
08-30 14:03:30.480  9825  9854 D worker  : starting job: 9
08-30 14:03:40.476  9825  9856 D worker  : job finished: 7
08-30 14:03:40.478  9825  9855 D worker  : job finished: 8
08-30 14:03:40.481  9825  9854 D worker  : job finished: 9
08-30 14:03:40.497  9825  9856 D worker  : starting job: 10
08-30 14:03:50.500  9825  9856 D worker  : job finished: 10

最佳答案

可以同时运行的作业数量实际上是由您配置的线程池决定的。默认的 Executor 定义为 here .

通常,当您使用 Worker 基类时,您会将 Worker 的实例关联到此 Executor 上的线程。如果您想更好地控制与 Worker 关联的线程,您可能需要查看 CoroutineWorkerListenableWorker

默认Executor 中的线程数由设备上的内核数决定。如果您希望所有 10 个作业同时运行,您必须执行以下操作:

  • 禁用默认的 WorkManager 初始化程序(通过为内容提供程序禁用 list 合并)。

  • Application.onCreate() 或您自己的 ContentProvider 上初始化 WorkManager。您需要在此处执行此操作,因为操作系统可以要求之前安排的 Worker 运行。有关详细信息,请参阅 this .

val configuration = Configuration.Builder()
    // Defines a thread pool with 10 threads. 
    // Ideally you would choose a number that is dynamic based on the number 
    // of cores on the device.
    .setExecutor(Executors.newFixedThreadPool(10))
    .build()

WorkManager.initialize(context, configuration)

在上面的示例中,我创建了一个固定大小的线程池,其中包含 10 个线程(这又可以处理 10 个 Worker)。现在,当您将 Worker 加入队列时,您会看到它们同时执行。

关于Android WorkManager 并发作业计数/最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52099624/

相关文章:

android - Jetpack Compose Path 将在 Canvas 边界之外绘制

抛出异常时Android CoroutineWorker重试

android - setExpedited 是如何工作的,它和前台服务一样好和可靠吗?

javascript - 使用 JavaScript 在 galaxy 平板电脑上自动滚动

java - 避免单实例变量在android中被混淆

android - 查找 NavHostFragment Jetpack Navigation Android 时出错

android - 如何使用 CameraX 设置正确的纵横比?

带单选按钮的 Android 颜色选择器

java - Android 位图重用

Android WorkManager 在使用 Robolectric 进行测试时出现错误