关于setConnectTimeout和setReadTimeout的问题

Posted 有梦就能实现

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于setConnectTimeout和setReadTimeout的问题相关的知识,希望对你有一定的参考价值。

1、问题描述

这几天测试重构后的下载框架,发现在下载过程中如果网络中断或网络较差,个别应用的下载就会阻塞卡住,一直卡在 “正在下载 xx%”。
 

2、问题排查和定位

思考:网络差不应该报网络异常的错误或者直接抛timeout异常吗?所以马上去检查Http请求的地方:发现在DownloadThread中使用HttpURLConnection进行网络请求时只是设置了connectTimeout,这样在建立连接的时候如果网络中断,那么超时以后就会报出错误,这里是没有问题的。会不会是还少设置了其他参数的原因呢?
 
于是赶紧去查阅资料:
ConnectTimeout只有在网络正常的情况下才有效,而当网络不正常时,ReadTimeout才真正的起作用,即IdIOHandlerStack 里的 WaitFor 是受ReadTimeout限制的,因此,这2个属性应该结合实用。
 
connect timeout 是建立连接的超时时间;
read timeout,是传递数据的超时时间。
 
正确的方法应当是调用HttpURLConnection的时候同时设置这两个超时时间。
一看代码,果然漏了setReadTimeout。。。。。OMG 。。。
 

3、解决方案

同时设置这两个超时时间:
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection(); urlCon.setConnectTimeout(20*1000);
urlCon.setReadTimeout(20*1000); 

以上是关于关于setConnectTimeout和setReadTimeout的问题的主要内容,如果未能解决你的问题,请参考以下文章

HttpURLConnection.connect 卡死 死锁怎么解决

计算机视觉算法——基于Transformer的语义分割(SETR / Segmenter / SegFormer)

计算机视觉算法——基于Transformer的语义分割(SETR / Segmenter / SegFormer)

模型魔改---基于SETR模型的边缘检测

SETR项目运行记录

“rs.close”和/或“设置 rs = 无”