2011-08-22 42 views
6

我工作的一個Android應用程序需要爲了從Android設備上的文件上傳到Web服務器使用的HttpClient。我上傳的文件最大可達1 Gb,因此如果設備在上傳過程中失去連接,則可能會發生超時。奇怪的是,我爲套接字設置的超時時間似乎沒有任何影響。只要我失去連接而不是引發SocketTimeoutException,應用程序就會掛起。的Apache的HttpClient 4.0未能超時套接字在Android

我試着使用:

HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT); 
HttpConnectionParams.setSoTimeout(params, CrashLogParams.TIMEOUT); 

但這只是工作的連接超時,而不是套接字超時。我也試過:

HttpParams p = httpclient.getParams(); 
p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); 
p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); 

我知道,連接超時工作的原因是因爲,我會執行

httpclient.execute(httppost); 

的應用似乎當連接上載過程中丟失掛起後獲得連接超時異常,但在應用程序成功連接到服務器之後。

爲了測試我的應用程序,我禁用了網絡在不同的時間來查看應用程序會如何反應。如果我在發送請求之前禁用網絡,則會出現連接錯誤,並且我的應用程序可以正常處理該錯誤,但如果在上載期間禁用它,應用程序將掛起。當然,我通過AsyncTasks完成所有這些請求,所以主UI線程不會崩潰。我只是想知道是否有其他方式來確保套接字在沒有收到任何數據時會超時,或者如果我在這裏丟失任何東西。我讀過很多博客和文章,但大多數人只是建議使用SO_TIMEOUT,這對我不起作用。

sotimeout not working in a multipart http post on android 2.1

+0

先後您的應用更小尺寸文件的工作? – momo

+0

我試過1 MB文件,錯誤仍然存​​在。我想用更小的文件,你將有更大的可能性斷開文件上傳之間的時間,但除此之外。我希望能夠在發生網絡故障時使我的應用程序健壯。 –

+0

我有這個相同的確切問題,除了我的上傳大小相當小,幾kb的順序。似乎需要觸發該錯誤的所有東西都是在我檢查它是否啓動之後但在我調用execute()之前,網絡關閉。 – Michael

回答

0

你創建自己的ClientConnectionManager?請查看sourceAndroidHttpClient.newInstance()

他們創造了新的BasicHttpParams對象並將其傳遞到構造函數既ThreadSafeClientConnectionManager和DefaultHttpClient。除了構造函數外,我沒有看到在ClientConnectionManager上設置參數的方法。

+1

是的,我正在擴展DefaultHttpClient來創建我自己的啓用SSL的HttpClient。擴展類重寫createClientConnectionManager(),並按照您所述設置HttpParams。我列出的代碼能夠正確設置連接超時時間,因爲當我增加超時時間時,我不得不等待直到發生異常的時間也相應增加。唯一的問題是,無論我嘗試什麼值,套接字超時都不會升高。 –

0

我面臨着同樣的問題,因爲你,用相同的使用情況。它發生在運行android 2.3.6的samsung galaxy s2上,但與4.x上的相同設備無關。不幸的是,這正是我的客戶使用的設備,它運行在大約10個其他測試設備與各種Android版本和構造...

我花了幾個小時嘗試與HttpUrlConnection庫而不是來自Apache的HttpClient,但最終結果是一樣的。 AndroidHttpClient顯示相同的行爲。這使我說,這聽起來像一個硬件實現或OS相關的問題......

我發現的唯一的解決方法是把HttpClient.execute()方法在一個單獨的線程,並調用thread.join(timeout)作爲安全停止線程如果有什麼出錯。其缺點是,當載運行良好,但比超時時間較長,該請求被中斷......

如果您發現了在此期間的東西,我將不勝感激,如果你可以分享。