我创建了新的作业重试政策:
new DefaultRetryPolicy(5000, 2, 2);
那么,backoffMultiplier
在DefaultRetryPolicy
中意味着什么?
答案 0 :(得分:9)
RetryPolicy处理这三个参数
超时 - 指定每次重试尝试的套接字超时(毫秒)。
重试次数 - 尝试重试的次数。
BackOff Multiplier - 一个乘数,用于确定每次重试尝试设置为套接字的指数时间。
以上示例
超时 - 5000秒,尝试次数 - 2,后退乘数 - 2
尝试1 :
time = time +(time * Back Off Multiplier);
时间= 5000 + 10000 = 15000
套接字超时=时间;
使用15秒的套接字超时调度请求
尝试2 :
time = time +(time * Back Off Multiplier);
时间= 15000 + 30000 = 45000
套接字超时=时间;
使用45秒的套接字超时调度请求
所以在尝试2结束时,如果仍然发生Socket Timeout,Volley会在你的UI Error响应处理程序中抛出TimeoutError。
答案 1 :(得分:8)
标记的答案是从this blog的答案中复制的,没有学分:(
以下是代码如何计算的解释......毕竟,你可以查看DefaultRetryPolicy.java它是开源的......
初始化时,它使用用户给定的值:
/**
* Constructs a new retry policy.
*
* @param initialTimeoutMs The initial timeout for the policy.
* @param maxNumRetries The maximum number of retries.
* @param backoffMultiplier Backoff multiplier for the policy.
*/
public DefaultRetryPolicy(int initialTimeoutMs, int maxNumRetries, float backoffMultiplier) {
mCurrentTimeoutMs = initialTimeoutMs;
mMaxNumRetries = maxNumRetries;
mBackoffMultiplier = backoffMultiplier;
}
因此,当代码检查当前超时时,它会收到第一个请求的initialTimeoutMs
值(而不是重试请求,原始请求)。
/** Returns the current timeout. */
@Override
public int getCurrentTimeout() {
return mCurrentTimeoutMs;
}
如果调用了retry()
,那么它会重新计算超时(对于retrt请求第2,第3等):
/**
* Prepares for the next retry by applying a backoff to the timeout.
*
* @param error The error code of the last attempt.
*/
@Override
public void retry(VolleyError error) throws VolleyError {
mCurrentRetryCount++;
mCurrentTimeoutMs += (int) (mCurrentTimeoutMs * mBackoffMultiplier);
if (!hasAttemptRemaining()) {
throw error;
}
}
因此,仅在第一个请求失败时,在第二个请求(重试请求)中添加后退乘数...等等...
使用initialTimeoutMs = 5000ms,maxNumRetries = 2,backoffMultiplier = 2
第一次请求超时5s 第二次请求超时(重试)5 + 10 = 15s 第3次请求超时(重试)15 + 30 = 45s
因此会有1个正常请求+2个重试。由于代码
,总计3个请求/** Returns true if this policy has attempts remaining, false otherwise. */
protected boolean hasAttemptRemaining() {
return mCurrentRetryCount <= mMaxNumRetries;
}
第一个请求mCurrentRetryCount
为0后,第二个请求1之后,第三个请求之后2.仅在第4个请求时,它将返回false
因为mCurrentRetryCount
仅从{retry()
增加1}}方法。