В чем различия между BackoffPolicy.EXPONENTIAL и BackoffPolicy.LINEAR при работе с Диспетчером работ? - PullRequest
0 голосов
/ 25 сентября 2018

Официальных документов (как я читал, по крайней мере, я) не существует, которые объясняли бы использование и механизм этих двух режимов.Как они работают?И какую проблему они решают?

Я буду признателен, если кто-нибудь сможет упростить это для меня, потому что я протестировал оба и не увидел ничего интересного.Если вы спросите меня, я бы сказал, что OneTimeWorkRequest.setBackoffCriteria() не влияет на работу.

Вот мои коды,

@Override
public void doSomethingUseful(String order) {

    Constraints constraint = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();

    Data data = new Data.Builder()
            .putString("order", order)
            .build();

    OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(OrderSenderWorker.class)
            .setConstraints(constraint)
            .setInputData(data)
            .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 15, TimeUnit.SECONDS)
            .build();

    WorkManager.getInstance().beginUniqueWork("refresh-order", ExistingWorkPolicy.REPLACE, oneTimeWorkRequest).enqueue();

}

И в классе Worker всякий раз, когда яесли что-то не так, я возвращаю WorkerResult.RETRY в методе doWork().

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Учитывая, что WorkManager использует счетчик попыток запуска в качестве эталона, для BackoffPolicy из 15 секунд будет следующим:

  • Для линейного: Время начала работы + (15 * Количество попыток выполнения)

  • Для экспоненциального: Время начала работы + Math.scalb (15, количество попыток запуска - 1)

время начала работы - это время, когда работа была выполнена впервые (1-я попытка запуска).

Количество попыток запуска - это количество попыток WorkManager выполнить конкретную работу.

Также обратите внимание, что максимальная задержка будет ограничена WorkRequest.MAX_BACKOFF_MILLIS .

Примите во внимание, что повторная попытка произойдет, только если вы укажете, что Работа требует этого, вернув WorkerResult.RETRY

0 голосов
/ 25 сентября 2018

Подумайте, запускаете ли вы API на сервере, если сервер возвращает определенный статус, вы снова обращаетесь к API через некоторое время.

Теперь, чтобы контролировать интервал времени между любыми двумя вызовами API, вы можете использовать BackoffPolicy.

Если вы используете BackoffPolicy.LINEAR, тогда интервал будет линейно увеличиваться до достижения порога.

или если вы используете BackoffPolicy.EXPONENTIAL, тогда интервал будет увеличиваться экспоненциально до достижения порогового значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...