backoffMultiplier在DefaultRetryPolicy中的含义是什么?

时间:2017-04-05 07:32:35

标签: android android-volley

我创建了新的作业重试政策:     new DefaultRetryPolicy(5000, 2, 2);

那么,backoffMultiplierDefaultRetryPolicy中意味着什么?

2 个答案:

答案 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}}方法。