理解Volley的重传超时时间计算方法

原文地址:http://www.githubs.cn/project/13071

Volley 的超时重传机制

Volley提供了非常方便的超时请求重试策略。Volley的所有请求默认情况下SocketTimeout和ConnectionTimeout都是5秒。
RetryPolicy是一个重试策略的接口,可以实现这个接口来满足特殊的重试策略。它定义了三个参数如下:
• Timeout:每一个请求的超时时长,以毫秒为单位
• Number Of Retries:重试次数
• BackOff Multiplier:后续重试的乘数因子

下面用一个例子来说明超时时间的计算方法:
Timeout: 3000 secs, Num of Attempt: 3, Back Off Multiplier: 2

第一次: time = time + (time * Back Off Multiplier );
time = 3000 + 6000 = 9000
Socket Timeout = time;
发出请求时设置的超时时间为9秒。

第二次: time = time + (time * Back Off Multiplier );
time = 9000 + 18000 = 27000
Socket Timeout = time;
发出请求时设置的超时时间为27秒。

第三次: time = time + (time * Back Off Multiplier );
time = 27000 + 54000 = 81000
Socket Timeout = time;
发出请求时设置的超时时间为81秒,即1分21秒。

如果三次重试之后仍然发生Socket Timeout,Volley将抛出一个TimeoutError。

下面是设置超时重传的一个代码例子:

//设置一个在Socket或连接超时时的重传机制。 
//Volley 会根据你设定的机制进行重试。
request.setRetryPolicy(new DefaultRetryPolicy(5000, 
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

后面加上点个人理解:

从上面的超时时间计算结果,我们可以看出,对于请求失败之后的请求,Volley并不会隔相同的时间去请求Server,也不是以线性的时间增长去请求,而是一个幂次曲线增长,一次比一次更长。
对于超时时间,可以总结为这样一个公式:
timeOut = time * power(1+ Back Off Multiplier , n);
对于例子:Timeout: 3000 secs, Num of Attempt: 3, Back Off Multiplier: 2
公式就是这样的了:
timeOut = 3000 * power(1+ 2 , n); (其中n取值1,2,3)
n=1时,timeOut=3000*3=9000;
n=2时,timeOut=3000*3*3=27000;
n=3时,timeOut=3000*3*3*3=81000;

最后,吐槽一句,原文中有一处错误:
time = 27000 + 54000 = 91000
应该是作者的一次失误,我们也可以理解。然而,有很多中文介绍Volley的文章,都引用了这个错误……

你可能感兴趣的:(Android)