我正在我的应用中下载文件并使用以下超时。
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,但是它对于停止下载仅仅一秒钟后没有任何影响。
答案 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.超时为零 被解释为无限超时。