Java Apache HttpClient 4.0无法在Android上为套接字超时

Java Apache HttpClient 4.0无法在Android上为套接字超时,java,android,sockets,timeout,httpclient,Java,Android,Sockets,Timeout,Httpclient,我正在开发一个Android应用程序,它需要使用HttpClient将文件从Android设备上传到web服务器。我正在上传的文件大小可达1GB,因此如果设备在上传过程中失去连接,可能会发生超时。奇怪的是,我为套接字设置的超时似乎没有任何效果。每当我失去连接时,应用程序就会挂起,而不是引发SocketTimeoutException 我尝试使用: HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT);

我正在开发一个Android应用程序,它需要使用HttpClient将文件从Android设备上传到web服务器。我正在上传的文件大小可达1GB,因此如果设备在上传过程中失去连接,可能会发生超时。奇怪的是,我为套接字设置的超时似乎没有任何效果。每当我失去连接时,应用程序就会挂起,而不是引发SocketTimeoutException

我尝试使用:

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,这对我来说并不适用


您是否正在创建自己的ClientConnectionManager?看一看这本书


它们创建一个新的BasicHttpParams对象,并将其传递给ThreadSafeClientConnectionManager和DefaultHttpClient的构造函数。除了在构造函数中,我看不到在ClientConnectionManager上设置参数的方法。

我面临与您相同的问题,使用相同的用例。这种情况发生在运行安卓2.3.6的三星galaxy s2上,但在4.x上的同一设备上则不同。不幸的是,这正是我的客户使用的设备,它可以在大约10台其他具有各种Android版本和构造函数的测试设备上正常运行

我花了数小时尝试使用
HttpUrlConnection
library而不是Apache的HttpClient,但最终结果是一样的
AndroidHttpClient
显示了相同的行为。这让我觉得这听起来像是硬件实现或操作系统相关的问题

我找到的唯一解决方法是将
HttpClient.execute()
方法放在一个单独的线程中,并调用
thread.join(timeout)
作为一种安全机制,在出现任何错误时停止线程。缺点是当上传运行正常但需要的时间超过超时时间时,请求会被中断


如果您同时发现了一些东西,如果您能与我分享,我将不胜感激。

是的,我正在扩展DefaultHttpClient以创建我自己的支持SSL的HttpClient。扩展类重写createClientConnectionManager(),并按照您所述设置HttpParams。我列出的代码能够正确设置连接超时,因为当我增加超时时间时,我必须等待异常出现的时间也相应增加。唯一的问题是,无论我尝试什么值,套接字超时都不会出现。你的应用程序是否可以处理较小的文件?我尝试了1MB的文件,但错误仍然存在。我想对于较小的文件,您在上传文件时更有可能断开连接,但这不是重点。我希望能够使我的应用程序在发生网络故障时保持健壮。我也遇到了同样的问题,只是我的上传大小相当小,只有几kb左右。触发该bug所需的一切似乎都是在我检查网络是否启动后,但在调用execute()之前,网络停止运行。