zoukankan      html  css  js  c++  java
  • HttpClient请求服务器代码优化版

    HttpClient请求服务器代码优化版

    首先,我在前面的两篇博文中介绍了在 Android中,除了使用java.net包下HttpUrlConnection的API访问HTTP服务之外,我们还可以换一种途径去完成工作。 Android SDK附带了Apache的HttpClient API。Apache HttpClient是一个完善的HTTP客户端,它提供了对HTTP协议的全面支持,可以使用HTTP GET和POST进行访问。那么,现在我们怎么样在android客户端优化这些代码呢?

    在前面介绍了怎么使用HttpClient后,我们需要考虑一个问题,在实际应用中,我们不能每次都新建HttpClient,而是应该只为整个app应 用创建一个HttpClient,并将其用于所有HTTP通信。此外,还应该注意在通过一个HttpClient同时发出多个请求时可能发生的多线程问 题。针对这两个问题,我们需要改进一下我们的项目,下面是这两个问题的解决方案:

    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连接。

    然后,想要让我们这个加强版的“Application”生效,需要在AndroidManifest.xml中做如下配置:

    <application  android:name=".MyApplication" ...>  
    ...  
    </application>  
    如果我们没有配置,系统默认会使用android.app.Application,我们添加了配置,系统就会使用我们的MyApplication,然后就可以用
    1. this  
    2.  
    使用完client不必关闭连接,因为整个app只有一个HttpClient,它为整个app服务的,到app退出时候会自动关闭。

    其实上面不必使用单例模式,因为app创建时候就只会执行一次onCreate方法,只会生成一个HttpClient客户端。


  • 相关阅读:
    如何培养编程所需要的逻辑思维?
    CSS教程
    Android中Service(服务)详解
    Tomcat热部署的实现原理
    Java多线程和线程池(转)
    导出Excel表格
    各种时间格式化的转化
    上传多媒体文件到微信公众平台
    发起https请求并获取结果
    Java 将字节转换为十六进制字符串
  • 原文地址:https://www.cnblogs.com/timssd/p/4874788.html
Copyright © 2011-2022 走看看