Android上的HttpClient:NoHttpResponseException根本原因在我的项目中,是不是?

我使用DefaultHttpClient从服务器获取数据,但偶尔发生NoHttpResponseException.

我参考了这篇文章a link,并且

HttpProtocolParams.setUseExpectContinue(httpClient.getParams(),false);

不适合我.

我使用HttpRequestRetryHandler来避免这个问题,它可以工作,但我不认为这是一个完美的方法,因为tcpdump在服务器端转储的网络数据包.

我发现当发生NoHttpResponseException时,在连接到服务器而不是在此请求之前使用的旧端口时使用新端口(HttpClient不重用旧连接).但是当从客户端连接到服务器端的新端口时,我没有找到任何tcp 3次握手数据包.但是基于tcp理论,握手是建立新连接时必须采取的步骤.

我不知道它是否是android的错误(我使用android 2.3进行测试),有没有人有想法?提前致谢.

解决方法

我建议你查看你的HttpClient版本,即使它使用得更广泛,Android上的HttpClient也不是由android团队维护的.您可能正在运行旧版本.以下是步骤:

>确保您获得最新版本 – http://hc.apache.org/downloads.cgi
>将httpcomponents-client-4.2.1-bin解压缩到工作区中的一个方便目录
>创建一个名为“Apache HttpClient 4.2.1”的用户库,并链接到.jar文件中(如果愿意,也可以附加源文档),并在库的“订购和导出”页面上选择导出.
>将库链接到您的项目.

另外,请检查连接参数设置.建议根据apache文档打开UseExpectContinue以获得性能(请参阅http://hc.apache.org/httpclient-3.x/performance.html).如果您使用的HTTP_1_0或更低,可能会导致问题.

这些设置适用于我(请注意使用HTTP_1_1,您的超时可能与我的不同):

HttpParams params = new BasicHttpParams();

        HttpProtocolParams.setVersion(params,HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params,HTTP.DEFAULT_CONTENT_CHARSET);
        HttpProtocolParams.setUseExpectContinue(params,true);

        httpconnectionParams.setStaleCheckingEnabled(params,false);
        httpconnectionParams.setConnectionTimeout(params,13000);
        httpconnectionParams.setSoTimeout(params,30000);
        httpconnectionParams.setSocketBufferSize(params,8192);

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...