次のワンタイムワーカーがいます。
// 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
の再試行戦略は何ですか?たとえば、WorkManager
の最大再試行回数は?これに関するドキュメントは明確ではありません。
デフォルトはBackoffPolicy.EXPONENTIAL
。 RETRY
にWorkerResult.RETRY
またはWorker
に必要な制約が満たされていない場合。だから例えばNETWORK
制約が必要で、デバイスがアクティブなNetwork
接続を失った場合-Worker
は停止され、自動的に再試行されます(制約が満たされた場合)。
詳細については、 docs をご覧ください。
次の例では、キャッチされる例外を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)
}