代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

WorkManager的OneTimeWorkRequest的重试策略/机制是什么?

  •  11
  • Cheok Yan Cheng  · 技术社区  · 7 年前

    我有以下一次工作。

    // 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();
    

    根据 https://developer.android.com/topic/libraries/architecture/workmanager

    // (Returning RETRY tells WorkManager to try this task again
    // later; FAILURE says not to try again.)
    

    我在想,如果 SyncWorker 继续返回 RETRY ,什么是重试策略 WorkManager ?例如,最大重试次数是多少 工作经理 ?文件对此不清楚。

    2 回复  |  直到 7 年前
        1
  •  17
  •   Rahul    7 年前

    默认值是 BackoffPolicy.EXPONENTIAL . 我们只在您要求时重试 RETRY 通过返回 WorkerResult.RETRY 或者当你的 Worker 现在未设置。例如,如果您需要 NETWORK 约束,现在设备失去活动状态 Network 连接-然后 工人 将停止并自动重试(满足约束时)。

    有关更多信息,请查看 docs .

        2
  •  0
  •   Mohdroid    6 年前

    下面的示例在退出前对捕获的异常重试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<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)
    

    }

    推荐文章