web-dev-qa-db-ja.com

WorkManagerのOneTimeWorkRequestの再試行戦略/メカニズムは何ですか

次のワンタイムワーカーがいます。

// 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.)

SyncWorkerRETRYを返し続ける場合、WorkManagerの再試行戦略は何ですか?たとえば、WorkManagerの最大再試行回数は?これに関するドキュメントは明確ではありません。

12
Cheok Yan Cheng

デフォルトはBackoffPolicy.EXPONENTIALRETRYWorkerResult.RETRYまたはWorkerに必要な制約が満たされていない場合。だから例えばNETWORK制約が必要で、デバイスがアクティブなNetwork接続を失った場合-Workerは停止され、自動的に再試行されます(制約が満たされた場合)。

詳細については、 docs をご覧ください。

18
Rahul

次の例では、キャッチされる例外を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()
}

}

注:デフォルトのBackoffPolicyは指数関数であり、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)

}

1
Mohdroid