gpt4 book ai didi

android - WorkManager 现有工作策略 APPEND_OR_REPLACE 未按预期运行

转载 作者:行者123 更新时间:2023-12-04 13:52:53 25 4
gpt4 key购买 nike

我目前正在使用 CoroutineWorker来自 androidx.work:work-runtime-ktx:2.5.0 .
我想要实现的是:

  • 使用 beginUniqueWork 将工作人员排入队列和相同uniqueWorkName , 政策 ExistingWorkPolicy.APPEND_OR_REPLACE .
  • 这将按顺序运行工作程序,如果工作失败或被取消,预期的行为将是,根据 documentation :

  • If there are failed or cancelled prerequisites, these prerequisites are dropped and the newly-specified work is the start of a new sequence.


    正在发生的事情是,如果前一个工作人员也被取消(或失败),那么所有或排队的工作人员都会被取消。这应该是 ExistingWorkPolicy.APPEND 的预期行为但不是 ExistingWorkPolicy.APPEND_OR_REPLACE .
    expected behavior -> actual behavior
    任何想法为什么会发生这种情况?如何避免排队的唯一工作人员也被取消?

    最佳答案

    姓名APPEND_OR_REPLACE具有误导性,通过阅读本文你会认为这 Worker如果失败将替换之前的worker,如果是RUNNING则追加,这是错误的!APPEND_OR_REPLACE表示将此工作人员附加到正在运行的 链条 或者如果前一个失败,则用新链替换链(创建一个新链并重新开始,就像硬重置一样)
    伪代码

    if (getChainWithUniqueTag(TAG).status == CANCELLED || FAILED) {
    createNewChine()
    }
    addRequestToChainWithTag(TAG,request)

    现在应该更有意义了,它是关于当前 的状态链条 而不是 工作

    要进一步确认这一点,请尝试使用唯一名称启动 worker1,然后使其失败(通过调用 Result.failure ),然后使用 APPEND 创建另一个 worker2具有相同的唯一名称, worker2将在开始之前直接失败,因为它属于失败的链。
    如果您尝试相同的场景,但使用 APPEND_OR_REPLACE , worker2将启动一个新的链并继续正常工作。
    考虑这个例子:
    val request1 = OneTimeWorkRequestBuilder<SleepWorker>()
    .setInputData(workDataOf(KEY_BREAK_AT to 5))
    .build()

    val request2 = OneTimeWorkRequestBuilder<SleepWorker>()
    .build()
    workManager.enqueueUniqueWork(
    TAG,
    ExistingWorkPolicy.APPEND_OR_REPLACE,
    request1
    )
    // Infinite loop
    while (workManager.getWorkInfoById(request1.id).get().state == WorkInfo.State.RUNNING){}

    workManager.enqueueUniqueWork(
    TAG,
    ExistingWorkPolicy.APPEND_OR_REPLACE,
    request2
    )

    SleepWorker
    class SleepWorker(context: Context, parameters: WorkerParameters) :
    CoroutineWorker(context, parameters) {
    override suspend fun doWork(): Result {
    val breakAt = inputData.getInt(KEY_BREAK_AT,-1)
    repeat(10) {
    if(it == breakAt) return Result.failure()
    println("$it")
    delay(1000L)
    }
    return Result.success()
    }
    }
    现在在这种情况下, request1会失败,然后我们开始 request2它会正常启动,因为 FLAG 是 APPEND_OR_REPLACE ,
    如果标志是 APPEND然后 request2将失败。
    PS:尝试移动第二个 enqueueUniqueWork对于 request2无限前 while循环, request2也会失败。有道理吗?
    因为当我们调用 enqueueUniqueWork当时链条很好,因此该工作已成功添加到该链条中。

    关于android - WorkManager 现有工作策略 APPEND_OR_REPLACE 未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67467297/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com