J'ai le travailleur ponctuel suivant.
// 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();
Selon https://developer.Android.com/topic/libraries/architecture/workmanager
// (Returning RETRY tells WorkManager to try this task again
// later; FAILURE says not to try again.)
Je me demandais, si SyncWorker
continue de retourner RETRY
, quelle est la stratégie de nouvelle tentative de WorkManager
? Par exemple, quel est le nombre maximal de tentatives pour WorkManager
? La documentation n'est pas claire à ce sujet.
La valeur par défaut est BackoffPolicy.EXPONENTIAL
. Nous réessayons uniquement lorsque vous nous demandez de RETRY
en renvoyant WorkerResult.RETRY
ou lorsque les contraintes requises pour votre Worker
ne sont plus satisfaites. Donc, par exemple si vous aviez besoin d'une contrainte NETWORK
et que le périphérique a perdu sa connexion Network
active - alors le Worker
sera arrêté et sera automatiquement réessayé (lorsque les contraintes seront remplies).
Pour plus d'informations, consultez le docs .
Cet exemple suivant réessaye 3 fois sur l'exception interceptée avant de quitter.
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()
}
}
REMARQUE: la politique BackoffPolicy par défaut est exponentielle, où la première tentative en 30 secondes (la période de relance minimale est de 10 s et la période de relance maximale ne dépasse jamais 18 000 s/5 heures).
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)
}