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

时间:2018-09-25 10:47:09

标签: 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();

}

Worker类中,每当出现问题时,我都会在WorkerResult.RETRY方法中返回doWork()

谢谢。

2 个答案:

答案 0 :(得分:2)

考虑到WorkManager使用运行尝试次数作为参考, BackoffPolicy 为15秒,将是下一个:

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

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

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

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

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

请注意,只有通过返回 WorkerResult.RETRY

来指定Work需要重试时,才会发生重试

答案 1 :(得分:1)

如果服务器返回特定状态,请考虑是否要在服务器上访问API,请在一段时间后再次访问API。

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

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

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