2011-08-22 44 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)作为安全停止线程如果有什么出错。其缺点是,当载运行良好,但比超时时间较长,该请求被中断......

如果您发现了在此期间的东西,我将不胜感激,如果你可以分享。