使用 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
指定工作需要重试时才会发生重试
没有任何官方文档(至少我已经阅读过文档)解释这两种模式的用法和背后的机制。它们是如何工作的?他们解决了什么问题?
如果有人能为我简化它,我将不胜感激,因为我已经测试了两者,但没有看到任何有趣的东西。如果你问我,我会说 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
指定工作需要重试时才会发生重试