HttpClient請求服務器代碼優化版

HttpClient請求服務器代碼優化版java

首先,我在前面的兩篇博文中介紹了在 Android中,除了使用java.net包下HttpUrlConnection的API訪問HTTP服務以外,咱們還能夠換一種途徑去完成工做。 Android SDK附帶了Apache的HttpClient API。Apache HttpClient是一個完善的HTTP客戶端,它提供了對HTTP協議的全面支持,可使用HTTP GET和POST進行訪問。那麼,如今咱們怎麼樣在android客戶端優化這些代碼呢? android

在前面介紹了怎麼使用HttpClient後,咱們須要考慮一個問題,在實際應用中,咱們不能每次都新建HttpClient,而是應該只爲整個app應 用建立一個HttpClient,並將其用於全部HTTP通訊。此外,還應該注意在經過一個HttpClient同時發出多個請求時可能發生的多線程問 題。針對這兩個問題,咱們須要改進一下咱們的項目,下面是這兩個問題的解決方案:apache

1.擴展系統默認的Application,並應用在項目中。(繼承系統的Application)安全

2.使用HttpClient類庫提供的ThreadSafeClientManager來建立和管理HttpClient。服務器

新建一個類MyApplication繼承系統的Application,代碼以下:
多線程

import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import android.app.Application;
public class MyApplication extends Application {
	private HttpClient httpClient;

	@Override
	public void onCreate() {
		super.onCreate();
		this.httpClient = this.createHttpClient();//app啓動時就建立一個HttpClient客戶端
	}

	@Override
	public void onTerminate() {
		super.onTerminate();
		this.shutdownHttpClient();//在app退出時候,關閉HttpClient客戶端
	}

	@Override
	public void onLowMemory() {
		super.onLowMemory();
		this.shutdownHttpClient();//在內存不足的時候,關閉HttpClient客戶端
	}

	// 建立HttpClient實例
	private HttpClient createHttpClient() {
		// 此處是創建一個HttpClient客戶端,包括配置參數
		HttpParams params = new BasicHttpParams();
		HttpClientParams.setRedirecting(params, true);// 設置是否能夠重定向
		HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
		HttpProtocolParams.setContentCharset(params, "Utf-8");
		HttpProtocolParams.setHttpElementCharset(params, "UTF-8");
		HttpConnectionParams.setConnectionTimeout(params, 5000);
		HttpConnectionParams.setSoTimeout(params, 3000);
		ConnManagerParams.setTimeout(params, 1000);// 從鏈接池中取鏈接的超時時間
		// 根據本身須要設置
		// ConnManagerParams.setMaxTotalConnections(params,200);//設置整個鏈接池最大鏈接數
		// ,即總並行連接最大數
		// ConnPerRoute connPerRoute = new ConnPerRouteBean(100);//每臺主機的最大並行連接數
		// ConnManagerParams.setMaxConnectionsPerRoute(params,connPerRoute);//每臺主機的最大並行連接數
		SchemeRegistry schreg = new SchemeRegistry();
		schreg.register(new Scheme("http", PlainSocketFactory
				.getSocketFactory(), 80));
		schreg.register(new Scheme("https",
				SSLSocketFactory.getSocketFactory(), 443));
		// 使用線程安全的鏈接管理來建立HttpClient
		ClientConnectionManager conman = new ThreadSafeClientConnManager(
				params, schreg);
		return new DefaultHttpClient(conman, params);
	}

	// 關閉鏈接管理器並釋放資源
	private void shutdownHttpClient(){
		if(httpClient != null && httpClient.getConnectionManager() != null){
			httpClient.getConnectionManager().shutdown();
		}
	}
	//提供公共方法對外使用
	public HttpClient getHttpClient(){
		return httpClient;
	}
}

咱們重寫了onCreate()方法,在系統啓動時就建立一個HttpClient;重寫了onLowMemory()和onTerminate()方 法,在內存不足和應用結束時關閉鏈接,釋放資源。須要注意的是,當實例化DefaultHttpClient時,傳入一個由 ThreadSafeClientConnManager建立的一個ClientConnectionManager實例,負責管理HttpClient 的HTTP鏈接。app

而後,想要讓咱們這個增強版的「Application」生效,須要在AndroidManifest.xml中作以下配置:ide

<application  android:name=".MyApplication" ...>  
...  
</application>  
若是咱們沒有配置,系統默認會使用android.app.Application,咱們添加了配置,系統就會使用咱們的MyApplication,而後就能夠用
  1. this  
  2.  
使用完client沒必要關閉鏈接,由於整個app只有一個HttpClient,它爲整個app服務的,到app退出時候會自動關閉。

其實上面沒必要使用單例模式,由於app建立時候就只會執行一次onCreate方法,只會生成一個HttpClient客戶端。優化

相關文章
相關標籤/搜索