使用 Work Manager 时 BackoffPolicy.EXPONENTIAL 和 BackoffPolicy.LINEAR 之间有什么区别?

Meh*_*esh 9 android android-workmanager

没有任何官方文档(至少我已经阅读了文档)来解释这两种模式背后的用法和机制。它们是如何工作的?他们解决了什么问题?

如果有人可以为我简化它,我将不胜感激,因为我已经测试了两者并且没有看到任何有趣的事情。如果你问我,我会说不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();

}
Run Code Online (Sandbox Code Playgroud)

Worker课堂上,每当我出错时,我都会WorkerResult.RETRYdoWork()方法中返回。

提前致谢 。

Per*_*abs 9

考虑到 WorkManager 使用运行尝试计数作为参考,对于15 秒的BackoffPolicy,将如下所示:

  • 对于线性:工作开始时间 +(15 * 运行尝试次数)

  • 对于指数: 工作开始时间 + Math.scalb(15, 运行尝试次数 - 1)

工作开始时间,是当作品首次执行(第一次运行的尝试)。

运行尝试计数是 WorkManager 尝试执行特定工作的次数。

另请注意,最大延迟将被限制在WorkRequest.MAX_BACKOFF_MILLIS

考虑到只有当您通过返回WorkerResult.RETRY指定工作需要重试时才会发生重试