Http請(qǐng)求時(shí)只設(shè)置setConnectTimeout造成的問題

1、問題描述

這幾天測(cè)試重構(gòu)后的下載框架,發(fā)現(xiàn)在下載過程中如果網(wǎng)絡(luò)中斷或網(wǎng)絡(luò)較差,個(gè)別應(yīng)用的下載就會(huì)阻塞卡住,一直卡在 “正在下載 xx%”。

2、問題排查和定位

思考:網(wǎng)絡(luò)差不應(yīng)該報(bào)網(wǎng)絡(luò)異常的錯(cuò)誤或者直接拋timeout異常嗎?所以馬上去檢查Http請(qǐng)求的地方:發(fā)現(xiàn)在DownloadThread中使用HttpURLConnection進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí)只是設(shè)置了connectTimeout,這樣在建立連接的時(shí)候如果網(wǎng)絡(luò)中斷,那么超時(shí)以后就會(huì)報(bào)出錯(cuò)誤,這里是沒有問題的。會(huì)不會(huì)是還少設(shè)置了其他參數(shù)的原因呢?

于是趕緊去查閱資料:
ConnectTimeout只有在網(wǎng)絡(luò)正常的情況下才有效,而當(dāng)網(wǎng)絡(luò)不正常時(shí),ReadTimeout才真正的起作用,即IdIOHandlerStack 里的 WaitFor 是受ReadTimeout限制的,因此,這2個(gè)屬性應(yīng)該結(jié)合實(shí)用。

connect timeout 是建立連接的超時(shí)時(shí)間;
read timeout,是傳遞數(shù)據(jù)的超時(shí)時(shí)間。

正確的方法應(yīng)當(dāng)是調(diào)用HttpURLConnection的時(shí)候同時(shí)設(shè)置這兩個(gè)超時(shí)時(shí)間。

一看代碼,果然漏了setReadTimeout。。。。。OMG 。。。

3、解決方案

同時(shí)設(shè)置這兩個(gè)超時(shí)時(shí)間:

HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setConnectTimeout(20*1000);
urlCon.setReadTimeout(20*1000); 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容