Какова стратегия / механизм повтора для OneTimeWorkRequest WorkManager - PullRequest
0 голосов
/ 23 мая 2018

У меня есть следующий одноразовый работник.

// 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?Документация по этому вопросу не ясна.

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Этот следующий пример повторяется 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 имеет экспоненциальный характер, где 1-я повторяется через 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)

}

0 голосов
/ 26 мая 2018

По умолчанию BackoffPolicy.EXPONENTIAL.Мы повторяем попытку только тогда, когда вы запрашиваете у нас RETRY, возвращая WorkerResult.RETRY, или когда ограничения, которые требовались для вашего Worker, теперь не выполнены.Например, если вам требовалось ограничение NETWORK, а теперь устройство потеряло свое активное Network соединение - тогда Worker будет остановлено и будет автоматически повторено (при соблюдении ограничений).

Для получения дополнительной информации смотрите документы .

...