Apache HttpClient 4.0无法在Android上超时



我正在开发一个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吗?看一下AndroidHttpClient.newInstance()的源代码。

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

我面临着与您相同的问题,使用相同的用例。运行android 2.3.6的三星galaxy s2会出现这种情况,而运行android 4的三星galaxy s2则不会。x。不幸的是,这正是我的客户使用的设备,并且它在大约10个其他具有不同Android版本和构造函数的测试设备上运行良好…

我花了几个小时尝试HttpUrlConnection库而不是来自Apache的HttpClient,但最终结果是相同的。AndroidHttpClient表现出相同的行为。这让我说,这听起来像是一个硬件实现或操作系统相关的问题…

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

如果你在此期间发现了什么,我将不胜感激。

相关内容

  • 没有找到相关文章

最新更新