首页 > 解决方案 > 如何按顺序执行工作经理任务(当您没有同时完成所有工作时)

问题描述

我想将一些对象上传到服务器。我正在使用工作管理器和 uniqueWork 来避免上传重复的对象。工作受到限制,因此它们仅在有互联网连接时才能运行。问题是我希望这些对象中的每一个一次上传一个,但是所有的工作都同时发生。

我知道我可以使用 beginWith 和 workContinuations 顺序执行工作,但不幸的是可以在不同时间创建多个对象,因此我无法在创建工作时访问所有工作。

val workRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setConstraints(networkConstraint)
            .build()
WorkManager.getInstance()
            .enqueueUniqueWork(uniqueName, ExistingWorkPolicy.KEEP, workRequest)

我假设enqueue所有的工作都会像排队一样一次完成。有没有办法让它这样工作?

标签: androidkotlinandroid-workmanager

解决方案


您可以使用 WorkManager 的UniqueWork构造来将工作排入队列,以便它只执行一次。独特的作品由uniqueName.

在您的情况下,您应该使用不同的ExistingWorkPollicy,如文档中所述:ExistingWorkPollicy.APPEND。这确保您的新请求附加在其他使用相同请求的请求之后uniqueName(这实际上创建了一个工作链)。

val workRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setConstraints(networkConstraint)
            .build()
WorkManager.getInstance()
            .enqueueUniqueWork(uniqueName, ExistingWorkPolicy.APPEND, workRequest)

推荐阅读