setConnectionTimeout可以阻止下载完成

时间:2013-02-01 12:27:25

标签: android http sockets timeout

我正在我的应用中下载文件并使用以下超时。

HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, 5000);

此时文件仅部分下载。如果在慢速移动网络上5秒内没有完成,则setSoTimeout为5秒可以停止下载吗?

来自Google Dev Docs,它说:

  

设置默认套接字超时(SO_TIMEOUT),以毫秒为单位   等待数据的超时时间。

这是指等待第一个数据的时间,还是等待任何进一步数据的时间? IE下载开始,但没有其他数据到达5秒钟。

修改 我做了一个测试,在那里我将SO_TIMEOUT减少到了100ms,但是它对于停止下载仅仅一秒钟后没有任何影响。

2 个答案:

答案 0 :(得分:1)

  

如果在慢速移动网络上5秒内没有完成下载,5秒钟的setSoTimeout会停止下载吗?

不,但是如果任何特定的read()调用花费超过5秒的时间来接收任何数据,它就会抛出SocketTimeoutException。当你得到那个例外时你所做的就由你决定。你可以重试。

如果您正在读取超时,则发送方停止,网络中断或读取超时太短。 5000毫秒是一个非常短暂的超时。提高它,看看会发生什么。

答案 1 :(得分:-1)

根据文档设置SO_TIMEOUT如果读取调用需要更多时间(在您的情况下为5000毫秒,此等待时间参考下载开始的时间),则会引发java.net.SocketTimeoutException异常,这意味着异常将中断您的下载过程。

  

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。   将此选项设置为非零超时,对()调用read()   与此Socket关联的InputStream将仅阻止此操作   多少时间。如果超时到期,a   引发了java.net.SocketTimeoutException,尽管Socket仍然存在   有效。必须在进入阻止之前启用该选项   操作有效。超时必须> 0.超时为零   被解释为无限超时。