Android HttpClient和ThreadSafeClientConnManager性能

时间:2012-07-23 23:40:43

标签: android apache-httpclient-4.x

我在调用HttpClient.execute(...)后对响应时间很长进行故障排除,我想确保在客户端上完成所有操作以优化HTTP性能请求。

对网络的请求需要1到40秒,但平均大约需要4秒。我不认为网络连接是一个瓶颈,因为我在一个强大的WiFi连接上,并没有速度问题。

HttpClient的设置如下:

public static final int MAX_TOTAL_CONNECTION = 20;
public static final int MAX_CONNECTIONS_PER_ROUTE = 20;
public static final int TIMEOUT_CONNECT = 15000;
public static final int TIMEOUT_READ = 15000;

SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));

HttpParams connManagerParams = new BasicHttpParams();
ConnManagerParams.setMaxTotalConnections(connManagerParams, MAX_TOTAL_CONNECTIONS);
ConnManagerParams.setMaxConnectionsPerRoute(connManagerParams, new ConnPerRouteBean(MAX_CONNECTIONS_PER_ROUTE));

HttpConnectionParams.setConnectionTimeout(connManagerParams, TIMEOUT_CONNECT);
HttpConnectionParams.setSoTimeout(connManagerParams, TIMEOUT_READ);

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(new BasicHttpParams(), schemeRegistry);
sHttpClient = new DefaultHttpClient(cm, connManagerParams);

现在主观提问:是否有更优化的方式进行设置?

我正在使用时间捕获将呼叫包裹到HttpClient.execute(...),因此调用execute(...)下面的所有内容都是花费4秒以上的平均值。

2 个答案:

答案 0 :(得分:0)

HttpConnectionParams.setTcpNoDelay(httpClient.getParams(), true);

运行免费的wireshark / sharkwire并告诉我们您的所见。

http://www.wireshark.org/

这将告诉您花费的时间。

答案 1 :(得分:0)

我在一段时间后修复了这个问题,但是我会发布被发现的问题/解决方案,因为其他人可能会在这里发现。

最初我假设一个请求进入HttpClient.execute(...)后会立即执行。在我的情况下,情况并非如此,因为我使用的是连接池,它在同一路径上重新使用连接。此外,客户端配置为每个路由使用2个连接。事实证明,我的一个代码块未能解析API响应,并且无法确保连接将被关闭。随着应用程序的继续,多个数据流被打开并阻止其他待处理的连接。这种有限的吞吐量导致了我遇到的错误行为。

使用类似EntityUtils.toString(entity)的内容成为消费内容的更好方式,并保证在完成后关闭连接。