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.setConnectTimeout(20*1000);
urlCon.setReadTimeout(20*1000);
參考連接:https://blog.csdn.net/jackson_wen/article/details/51923514