在实际的应用中,我们的联网应用程序里应该有一个HttpClient,并将其用于所有的HTTP通信。这就可能在同一个Http Client同时发出多个请求,也就产生了多线程的问题。幸运的是,在HttpClient里提供了一些工具来简化了这一个任务。下面我们看看使用ThreadSafeClientConnManager来创建DefaultHttpClient
private HttpClient createHttpClient(){
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http",PlainSocketFactory.getSocketFactory(),80));
schReg.register(new Scheme("https",PlainSocketFactory.getSocketFactory(),433));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params,schReg);
return new DefaultHttpClient(conMgr,params);
};
这样就完成了多线程的HttpClient的创建.
httpClient 想要保持回话,每一次连接时候 都必须是同一个 httpClient,也就是说 你第一次登陆时候使用的httpClient 和以后再次访问使用的httpClient必须是同一个。
DefaultHttpClient httpclient =
createHttpClient();
try
{
HttpPost httpost =
new
HttpPost(url);
// 添加参数
List<NameValuePair> nvps =
new
ArrayList<NameValuePair>();
if
(params !=
null
&& params.keySet().size() >
0
) {
Iterator iterator = params.entrySet().iterator();
while
(iterator.hasNext()) {
Map.Entry entry = (Entry) iterator.next();
nvps.add(
new
BasicNameValuePair((String) entry.getKey(),
(String) entry.getValue()));
}
}
//设置请求的编码格式
httpost.setEntity(
new
UrlEncodedFormEntity(nvps, Consts.UTF_8));
//登录一遍
httpclient.execute(httpost);
//然后再第二次请求普通的url即可。
httpost =
new
HttpPost(url2);
BasicResponseHandler responseHandler =
new
BasicResponseHandler();
System.out.println(httpclient.execute(httpost, responseHandler));
}
finally
{
// 关闭请求
httpclient.getConnectionManager().shutdown();
}