Android WorkManager的重试策略/机制是什么;s一次性工作请求

Android WorkManager的重试策略/机制是什么;s一次性工作请求,android,android-architecture-components,android-workmanager,Android,Android Architecture Components,Android Workmanager,我有以下的一次性工人 // Create a Constraints that defines when the task should run Constraints constraints = new Constraints.Builder() .setRequiredNetworkType(NetworkType.UNMETERED) .setRequiresBatteryNotLow(true) // Many other constrai

我有以下的一次性工人

// Create a Constraints that defines when the task should run
Constraints constraints = new Constraints.Builder()
        .setRequiredNetworkType(NetworkType.UNMETERED)
        .setRequiresBatteryNotLow(true)
        // Many other constraints are available, see the
        // Constraints.Builder reference
        .build();

OneTimeWorkRequest oneTimeWorkRequest =
        new OneTimeWorkRequest.Builder(SyncWorker.class)
                .setConstraints(constraints)
                .addTag(SyncWorker.TAG)
                .build();


我想知道,如果
SyncWorker
继续返回
RETRY
,那么
WorkManager
的重试策略是什么?例如,
WorkManager
的最大重试次数是多少?文档对此不清楚。

默认值为
BackoffPolicy.index
。 只有当您要求我们通过返回
WorkerResult进行
retry
时,我们才会重试。重试
或者当您的
工作者所需的约束现在未得到满足时。因此,例如,如果您需要
网络
约束,而现在设备失去了其活动的
网络
连接,则
工作者
将停止并自动重试(当满足约束时)


有关更多信息,请参阅

以下示例在退出之前,对捕获的异常重试3次

class RepeatWorker(context : Context, params : WorkerParameters)
    : Worker(context, params) {

    private fun doSomeThing() {
        // do something
    }

    override fun doWork(): Result {

        if (runAttemptCount > 3) {
            return Result.failure()
        }

        try {
            doSomeThing()
        }
        catch (e: Exception) {
            e.printStackTrace()
            return Result.retry()
        }
        return Result.success()
    }
}
注意:默认退避策略是指数型的,30秒内第一次重试(最小重试时间为10秒,最大重试时间不得超过18000秒/5小时)

fun start():LiveData{
val WORK_NAME=“SingleBackupWorker”
val constraints=constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val work=OneTimeWorkRequestBuilder()
.setConstraints(约束)
.setInitialDelay(5,时间单位秒)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL,1,时间单位.分钟)
.build()
WorkManager.getInstance().enqueueUniqueWork(工作名称,ExistingWorkPolicy.REPLACE,工作)
返回WorkManager.getInstance().getWorkInfoByIdLiveData(work.id)
}

runAttemptCount
获取任何工作的当前运行尝试计数。请注意,对于周期性工作,此值在周期之间重置。链接:-

例如:

override fun doWork(): Result {

    if (runAttemptCount < maxRetryConstantIWant) {
    ..... 
    .....
    .....
    } else { Result.Failure }
}
override fun doWork():结果{
if(runAttemptCount

这里
runAttemptCount
是worker方法。

这很奇怪,因为我遇到过一些不符合约束条件的实例,在满足约束条件后,它会推迟worker的执行。对这种行为有什么见解吗?@MEDIY您可以从您的doWork方法()返回
RETRY
。@sam_k我知道
RETRY
。不过我现在才意识到所有这些处决都被推迟了。因此,即使我们重试,重试执行也会延迟,但它会在一段时间后执行。如果要立即执行某些操作,则必须使用startForeGroundService@Rahul当需要在队列中最后一个工作线程之后重试某些唯一(命名)工作时,情况如何?我有N个相同类型的工作线程,如果某些信息还不可用,可能需要重试,但如果其中一个失败,我需要在队列中的其他工作线程可以尝试首先获取其信息时重试(以避免同一个工作线程“永远”失败,直到其特定信息可用为止)。可以设计这个工作流吗?嘿,你从哪里得到关于最大重试时间的信息?嗯,文档中应该有一个关于使用
runAttemptCount
限制重试次数的例子
fun start() : LiveData<WorkInfo> {
    val WORK_NAME = "SingleBackupWorker"

    val constraints = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build()

    val work = OneTimeWorkRequestBuilder<BackupWorker>()
            .setConstraints(constraints)
            .setInitialDelay(5, TimeUnit.SECONDS)
            .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.MINUTES)
            .build()

    WorkManager.getInstance().enqueueUniqueWork(WORK_NAME, ExistingWorkPolicy.REPLACE, work)

    return WorkManager.getInstance().getWorkInfoByIdLiveData(work.id)
}
override fun doWork(): Result {

    if (runAttemptCount < maxRetryConstantIWant) {
    ..... 
    .....
    .....
    } else { Result.Failure }
}