以前上傳文件時報這個異常沒這麼在意,這次網絡不好時總是報這個異常,導致文件上傳失敗,故特意說明一下,報個異常的原因還是很多的,今日只針對我當前遇上的問題進行記錄一下。
背景:平時網絡好的時候,我開啓線程的上傳和下載都沒問題,網絡慢的時候就出來這個異常 Recv failure: Connection reset by peer 。
異常的原因有兩點:1、網絡非常慢時易導致該異常;2、線程多次重複請求網絡服務造成的異常,因爲上次啓用的線程還沒斷開,所以該服務一直存在,導致再次進行上傳請求時異常。
開始寫的線程是這樣寫的:
new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { File file = new File(filePath); uploadForm(param, fileKey, file, file.getName(), RequestURL, mContext); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); |
這種寫法是相當方便,當請求結束後會自動回收線程,但是如果請求一直沒有反應,這個線程將一直存在,所以當我們點擊第二次上傳請求服務的時候,依然會報異常,因爲該線程一直暫用了這個“道”,其他的請求就無路可請,所以更改爲:
if (mThread != null) { mThread.interrupt(); mThread = null; } mThread = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { File file = new File(filePath); uploadForm(param, fileKey, file, file.getName(), RequestURL, mContext); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); mThread.start(); |
更改後,上傳異常解決了!
更改後的代碼中,我們對每次的線程請求進行了判斷,保證了每次請求的獨立性,在上一個項目中也同樣遇上這個問題,當時更改成socket進行傳輸就Ok,問題的解決方案是多樣性的,希望遇上同樣問題的你能有所幫助!