web-dev-qa-db-fra.com

Quels sont la stratégie / le mécanisme de nouvelle tentative pour OneTimeWorkRequest de WorkManager

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.

12
Cheok Yan Cheng

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 .

18
Rahul

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)

}

1
Mohdroid