android - 如何限制 WorkManager 中并行运行的工作人员数量?
问题描述
我将文件(由用户选择)排入队列以上传,然后使用 WorkManager 更新同步状态,如下所示:
fun schedule(files: List<String>) {
var cont = workManager
.beginUniqueWork(issueId, APPEND, files.map { workRequest(it) })
.then(updateSyncStatusWork)
.enqueue()
}
它运作良好。但是当用户选择很多文件来查看日志时,我看到很多文件正在同时上传(大约 10 个甚至全部)。并且发生了很多超时。我相信减少并行上传次数会减少超时次数,但我在 WorkManager 或 WorkRequest 中找不到任何允许这样做的 API。
PS我不考虑将它们链接起来,因为上传失败会丢弃所有文件的上传。
解决方案
可以同时运行的作业数量实际上是由你配置的线程池决定的。默认值在此处Executor
定义。
通常,当您使用Worker
基类时,会将 的实例与Worker
this 上的线程相关联Executor
。如果您想更好地控制与您Worker
关联的线程,您可能需要查看CoroutineWorker
or ListenableWorker
。
默认情况下的线程Executor
数由设备上的内核数决定。如果您只想N
同时运行作业,则必须执行以下操作:
禁用默认
WorkManager
初始化程序(通过禁用内容提供者的清单合并)。在或您自己
WorkManager
的. 您需要在此处执行此操作,因为操作系统可以要求以前安排的 s 运行。有关更多信息,请查看此。Application.onCreate()
ContentProvider
Worker
val configuration = Configuration.Builder()
// Defines a thread pool with 2 threads.
// This can be N (typically based on the number of cores on the device)
.setExecutor(Executors.newFixedThreadPool(2))
.build()
WorkManager.initialize(context, configuration)
在上面的示例中,我正在创建一个具有 2 个线程的固定大小的线程池(这又可以同时处理 2 个线程Workers
)。现在,当您将Worker
s 排入队列时,您将看到其中只有 2 个同时执行。
推荐阅读
- excel - 您如何获得 excel 文本中使用的不同 ThemeFonts?
- r - 如何使用 str_detect 在数据框中查找特定值
- python - 在熊猫中将2个标签组合成单个标签
- tensorflow - Tensorflow 对象检测 API - PYTHONPATH 在使用不同的终端时自行取消设置
- azure - Azure AD + ASP.Net Core 2.1 的未经授权的响应和无效的受众错误
- html - 全屏网页页脚的动态大小
- amazon-s3 - 用于 terraform 后端的 s3 存储桶的访问被拒绝
- ssl - NiFi ListenHTTP 处理器:使用不受支持的协议
- android - 单击按钮后的Android Studio应用程序迷恋
- php - Laravel 在整数和数组形式的列之间创建关系