ole*_*men 3 android android-workmanager
我将文件(由用户选择)排队上传,然后使用 WorkManager 更新同步状态,如下所示:
fun schedule(files: List<String>) {
var cont = workManager
.beginUniqueWork(issueId, APPEND, files.map { workRequest(it) })
.then(updateSyncStatusWork)
.enqueue()
}
Run Code Online (Sandbox Code Playgroud)
效果很好。但是,当用户选择大量文件并查看日志时,我发现很多文件正在同时上传(大约 10 个甚至全部)。并且发生了很多超时。我相信减少并行上传数量会减少超时次数,但我在 WorkManager 或 WorkRequest 中找不到任何允许这样做的 API。
PS 我不考虑链接它们,因为上传失败会删除其后所有文件的上传。
可以同时运行的作业数量实际上是由您配置的线程池决定的。默认值在此处Executor定义。
通常,当您使用Worker基类时,您会将 的实例关联Worker到 this 上的线程Executor。如果您想更好地控制与哪个线程Worker关联,您可能需要查看CoroutineWorker或ListenableWorker。
默认情况下的线程数Executor由设备上的核心数决定。如果您只想N同时运行多个作业,则必须执行以下操作:
禁用默认WorkManager初始化程序(通过禁用内容提供程序的清单合并)。
WorkManager或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)
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,我创建了一个具有 2 个线程的固定大小线程池(反过来可以Workers同时处理 2 个线程)。现在,当您将Workers 排入队列时,您将看到其中只有 2 个同时执行。
| 归档时间: |
|
| 查看次数: |
2253 次 |
| 最近记录: |