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

What are differences between BackoffPolicy.EXPONENTIAL and BackoffPolicy.LINEAR when working with Work Manager?

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

如果有人能为我简化它,我将不胜感激,因为我已经测试了两者,但没有看到任何有趣的东西。如果你问我,我会说 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 class 中,每当我出错时,我都会在 doWork() 方法中执行 return WorkerResult.RETRY

提前致谢。

考虑一下如果你在服务器上点击 API 如果服务器 return 特定状态你在一段时间后再次点击 API。

现在要控制任意两次API调用之间的间隔时间,可以使用BackoffPolicy。

如果您使用BackoffPolicy.LINEAR,则间隔时间将线性增加,直到达到阈值。

或者如果您使用 BackoffPolicy.EXPONENTIAL,则间隔时间将呈指数增长,直到达到阈值。

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

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

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

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

运行 attempt count 是 WorkManager 尝试执行特定 Work 的次数。

另请注意,最大延迟上限为 WorkRequest.MAX_BACKOFF_MILLIS

请注意,仅当您通过返回 WorkerResult.RETRY

指定工作需要重试时才会发生重试