Android 的 WorkManager 的同步作业 Count/Max
Android's WorkManager's Simultaneous Job Count/Max
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
基础 class 时,您会将 Worker
的实例关联到此 Executor
上的线程。如果您想更好地控制 Worker
与哪个线程关联,您可能需要查看 CoroutineWorker
或 ListenableWorker
。
默认Executor
中的线程数由设备上的内核数决定。如果您希望所有 10 个作业同时 运行,您必须执行以下操作:
禁用默认的 WorkManager
初始化程序(通过为内容提供程序禁用清单合并)。
在 Application.onCreate()
或您自己的 ContentProvider
上初始化 WorkManager
。您需要在此处执行此操作,因为 OS 可以向 运行 请求先前安排的 Worker
s。有关详细信息,请查看 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 个 Workers
)。现在,当您将 Worker
加入队列时,您会看到它们同时执行。
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
基础 class 时,您会将 Worker
的实例关联到此 Executor
上的线程。如果您想更好地控制 Worker
与哪个线程关联,您可能需要查看 CoroutineWorker
或 ListenableWorker
。
默认Executor
中的线程数由设备上的内核数决定。如果您希望所有 10 个作业同时 运行,您必须执行以下操作:
禁用默认的
WorkManager
初始化程序(通过为内容提供程序禁用清单合并)。在
Application.onCreate()
或您自己的ContentProvider
上初始化WorkManager
。您需要在此处执行此操作,因为 OS 可以向 运行 请求先前安排的Worker
s。有关详细信息,请查看 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 个 Workers
)。现在,当您将 Worker
加入队列时,您会看到它们同时执行。