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客户端。优化

相关文章
相关标签/搜索