/**
* 適合多線程的HttpClient,用httpClient4.2.1實現
* @return DefaultHttpClient
*/
public static DefaultHttpClient getHttpClient()
{
// 設置組件參數, HTTP協議的版本,1.1/1.0/0.9
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true);
//設置連接超時時間
int REQUEST_TIMEOUT = 10*1000; //設置請求超時10秒鐘
int SO_TIMEOUT = 10*1000; //設置等待數據超時時間10秒鐘
//HttpConnectionParams.setConnectionTimeout(params, REQUEST_TIMEOUT);
//HttpConnectionParams.setSoTimeout(params, SO_TIMEOUT);
params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, REQUEST_TIMEOUT);
params.setParameter(CoreConnectionPNames.SO_TIMEOUT, SO_TIMEOUT);
//設置訪問協議
SchemeRegistry schreg = new SchemeRegistry();
schreg.register(new Scheme("http",80,PlainSocketFactory.getSocketFactory()));
schreg.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));
//多連接的線程安全的管理器
PoolingClientConnectionManager pccm = new PoolingClientConnectionManager(schreg);
pccm.setDefaultMaxPerRoute(20); //每個主機的最大並行鏈接數
pccm.setMaxTotal(100); //客戶端總並行鏈接最大數
DefaultHttpClient httpClient = new DefaultHttpClient(pccm, params);
return httpClient;
}
如果以上代碼有問題可能是現在安卓包裏缺少PoolingClientConnectionManager這個類,倒入httpclient4.2.1解決問題。
另一種直接使用安卓內置的httpclient包的用法(ClientConnectionManager線程安全的連接管理類):
/**
*
* @return DefaultHttpClient
*/
public static synchronized DefaultHttpClient getHttpClient()
{
if(httpClient == null)
{
Log.v(TAG, "->> httpClient is null ->> do getHttpClient");
// 設置組件參數, HTTP協議的版本,1.1/1.0/0.9
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true);
//設置連接超時時間
int REQUEST_TIMEOUT = 10 * 1000; //設置請求超時10秒鐘
int SO_TIMEOUT = 10 * 1000; //設置等待數據超時時間10秒鐘
HttpConnectionParams.setConnectionTimeout(params, REQUEST_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, SO_TIMEOUT);
ConnManagerParams.setTimeout(params, 1000); //從連接池中取連接的超時時間
//設置訪問協議
SchemeRegistry schreg = new SchemeRegistry();
schreg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schreg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
// 使用線程安全的連接管理來創建HttpClient
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schreg);
httpClient = new DefaultHttpClient(conMgr, params);
}
return httpClient;
}