【问题标题】:Can a CoroutineWorker schedule another worker?CoroutineWorker 可以安排另一个工人吗?
【发布时间】:2020-11-26 10:56:04
【问题描述】:

我想与一名工人安排另一份工作。但是,我在文档中找不到是否允许这样做。

类似:

class MyWorker(context: Context, params: WorkerParameters): CoroutineWorker(context, params) {

    override val coroutineContext = Dispatchers.IO

    override suspend fun doWork(): Result = coroutineScope {
        val syncWorker = OneTimeWorkRequestBuilder<MyWorker>()
            .setInitialDelay(3000, TimeUnit.MILLISECONDS)
            .build()

        WorkManager.getInstance(context)
            .enqueueUniqueWork("MyJob", ExistingWorkPolicy.REPLACE, syncWorker)
        Result.success()
    }

【问题讨论】:

    标签: android android-workmanager


    【解决方案1】:

    可以,但有一个例外。

    唯一可能有危险的情况是,如果您将来自同一工作人员实例的具有ExistingWorkPolicy.REPLACE 的唯一工作人员排入队列(以您的为例,您不能从相同的syncWorker 重新安排工作):

    class syncWorker(context: Context, params: WorkerParameters): CoroutineWorker(context, params) {
    
        override suspend fun doWork(): Result {
            withContext(Dispatchers.IO) {
                val syncWorker = OneTimeWorkRequestBuilder<MyWorker>()
                    .build()
    
                // DON'T DO THIS!!!
                // You may end up with two instances of the same worker
                // running at the same time
                WorkManager.getInstance(context)
                    .enqueueUniqueWork("MyJob", ExistingWorkPolicy.REPLACE, syncWorker)
                Result.success()
            }   
        }
    }
    

    还要注意coroutineContext is now deprecated。改用 withContext(Dispatchers.IO) 就像我的 sn-ps 中的节目一样。

    【讨论】:

    • 那么,我必须至少有 2 名工人,其中一名用于制定此手动计划?
    • 另外,如果我使用 KEEP 而不是 REPLACE,我将避免同时运行同一工作者的 2 个实例?
    • 使用ExistingWorkPolicy.KEEP 可以避免如果一个worker 已经被调度并且它不是处于最终状态,那么它会被重新调度。关于你的第一个问题。正如我所说,如果你将一个唯一的工人从同一个工人的另一个实例中排入队列,你可能会遇到问题。从您在最初问题中发布的代码来看,情况并非如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2012-09-14
    相关资源
    最近更新 更多