Android的WorkManager的同时作业数量/最大值

5

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

1
你有关于这个的任何更新吗? - Gowtham
不,我没有收到任何关于这个的更新。 - Maalevolent
1个回答

9
可以同时运行的作业数量实际上是由您配置的线程池来确定的。默认的Executor这里定义。
通常情况下,当您使用Worker基类时,您会将Worker实例与此Executor上的线程关联起来。如果您想更好地控制Worker关联的线程,请查看CoroutineWorkerListenableWorker
默认Executor中的线程数取决于设备上的核心数。如果您想让所有10个作业同时运行,您需要执行以下操作:
  • 禁用默认的WorkManager初始化程序(通过禁用内容提供程序的清单合并)。

  • Application.onCreate()或您自己的ContentProvider上初始化WorkManager。您需要在这里执行此操作,因为操作系统可能会要求先前安排的Worker运行。有关更多信息,请参见此处

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放入队列时,您会看到它们全部同时执行。

在考虑工人数量时需要考虑的一个限制因素是工人之间是否存在依赖关系。如果WorkerB依赖于1000个WorkerA并传递一些最小量的数据,则会出现IllegalStateException“当序列化时,数据不能占用超过10240字节”。 - Brendan Weinstein
虽然这听起来很合理,但在我的情况下,我将其设置为单线程执行器。但它仍然同时启动多个工作人员的“doWork”。配置是正确的,我确保它被调用。现在只是非常困惑... - hannojg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接