android - 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
定义。
通常,当您使用Worker
基类时,会将 的实例与Worker
this 上的线程相关联Executor
。如果您想更好地控制与您Worker
关联的线程,您可能需要查看CoroutineWorker
or ListenableWorker
。
默认情况下的线程Executor
数由设备上的内核数决定。如果您希望所有 10 个作业同时运行,您必须执行以下操作:
禁用默认
WorkManager
初始化程序(通过禁用内容提供者的清单合并)。在或您自己
WorkManager
的. 您需要在此处执行此操作,因为操作系统可以要求以前安排的 s 运行。有关更多信息,请查看此。Application.onCreate()
ContentProvider
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 个Workers
)的固定大小的线程池。现在,当您将Worker
s 排入队列时,您会看到所有这些都同时执行。
推荐阅读
- java - Wildfly 模块与 Fat EAR 文件的补丁
- azure - 无法访问用于沉浸式 VR 的 Windows SpatialPerception
- amazon-web-services - 将新对象添加到地图时 Terraform 重新生成资源
- flutter - 轻敲 InkWell 内部时如何防止对周围 InkWell 产生涟漪效应
- pagespeed - Lighthouse 返回错误:generic::internal: APP::1: 渲染器异常终止,状态 = crashed exit_code = 1
- php - 通过代理服务器进行 PHP LDAP 身份验证
- c# - asp.net core 一个系统中的两个数据库
- python - Python并行调用多个函数并合并结果
- asp.net-core - Donet core 不同版本的“Microsoft.AspNetCore.Authentication.Abstractions”之间的冲突
- sql-server - SQL SERVER - 我认为中国黑客试图破解我的 SQL SERVER