Android使用HttpClient请求服务器代码优化版

来源:互联网 发布:java 日期相差天数 编辑:程序博客网 时间:2024/06/06 09:46

首先,我在前面的两篇博文中介绍了在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,代码如下:

[java] view plain copy
print?
  1. import org.apache.http.HttpVersion;  
  2. import org.apache.http.client.HttpClient;  
  3. import org.apache.http.client.params.HttpClientParams;  
  4. import org.apache.http.conn.ClientConnectionManager;  
  5. import org.apache.http.conn.params.ConnManagerParams;  
  6. import org.apache.http.conn.scheme.PlainSocketFactory;  
  7. import org.apache.http.conn.scheme.Scheme;  
  8. import org.apache.http.conn.scheme.SchemeRegistry;  
  9. import org.apache.http.conn.ssl.SSLSocketFactory;  
  10. import org.apache.http.impl.client.DefaultHttpClient;  
  11. import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;  
  12. import org.apache.http.params.BasicHttpParams;  
  13. import org.apache.http.params.HttpConnectionParams;  
  14. import org.apache.http.params.HttpParams;  
  15. import org.apache.http.params.HttpProtocolParams;  
  16.   
  17. import android.app.Application;  
  18.   
  19. public class MyApplication extends Application {  
  20.     private HttpClient httpClient;  
  21.   
  22.     @Override  
  23.     public void onCreate() {  
  24.         super.onCreate();  
  25.         this.httpClient = this.createHttpClient();//app启动时就创建一个HttpClient客户端  
  26.     }  
  27.   
  28.     @Override  
  29.     public void onTerminate() {  
  30.         super.onTerminate();  
  31.         this.shutdownHttpClient();//在app退出时候,关闭HttpClient客户端  
  32.     }  
  33.   
  34.     @Override  
  35.     public void onLowMemory() {  
  36.         super.onLowMemory();  
  37.         this.shutdownHttpClient();//在内存不足的时候,关闭HttpClient客户端  
  38.     }  
  39.   
  40.     // 创建HttpClient实例  
  41.     private HttpClient createHttpClient() {  
  42.         // 此处是建立一个HttpClient客户端,包括配置参数  
  43.         HttpParams params = new BasicHttpParams();  
  44.         HttpClientParams.setRedirecting(params, true);// 设置是否可以重定向  
  45.         HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
  46.         HttpProtocolParams.setContentCharset(params, "Utf-8");  
  47.         HttpProtocolParams.setHttpElementCharset(params, "UTF-8");  
  48.         HttpConnectionParams.setConnectionTimeout(params, 5000);  
  49.         HttpConnectionParams.setSoTimeout(params, 3000);  
  50.         ConnManagerParams.setTimeout(params, 1000);// 从连接池中取连接的超时时间  
  51.         // 根据自己需要设置  
  52.         // ConnManagerParams.setMaxTotalConnections(params,200);//设置整个连接池最大连接数  
  53.         // ,即总并行链接最大数  
  54.         // ConnPerRoute connPerRoute = new ConnPerRouteBean(100);//每台主机的最大并行链接数  
  55.         // ConnManagerParams.setMaxConnectionsPerRoute(params,connPerRoute);//每台主机的最大并行链接数  
  56.         SchemeRegistry schreg = new SchemeRegistry();  
  57.         schreg.register(new Scheme("http", PlainSocketFactory  
  58.                 .getSocketFactory(), 80));  
  59.         schreg.register(new Scheme("https",  
  60.                 SSLSocketFactory.getSocketFactory(), 443));  
  61.         // 使用线程安全的连接管理来创建HttpClient  
  62.         ClientConnectionManager conman = new ThreadSafeClientConnManager(  
  63.                 params, schreg);  
  64.         return new DefaultHttpClient(conman, params);  
  65.     }  
  66.   
  67.     // 关闭连接管理器并释放资源  
  68.     private void shutdownHttpClient(){  
  69.         if(httpClient != null && httpClient.getConnectionManager() != null){  
  70.             httpClient.getConnectionManager().shutdown();  
  71.         }  
  72.     }  
  73.     //提供公共方法对外使用  
  74.     public HttpClient getHttpClient(){  
  75.         return httpClient;  
  76.     }  
  77. }  

我们重写了onCreate()方法,在系统启动时就创建一个HttpClient;重写了onLowMemory()和onTerminate()方法,在内存不足和应用结束时关闭连接,释放资源。需要注意的是,当实例化DefaultHttpClient时,传入一个由ThreadSafeClientConnManager创建的一个ClientConnectionManager实例,负责管理HttpClient的HTTP连接。

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

[java] view plain copy
print?
  1. <application  android:name=".MyApplication" ...>    
  2. ...    
  3. </application>    
如果我们没有配置,系统默认会使用android.app.Application,我们添加了配置,系统就会使用我们的MyApplication,然后就可以用

  1.     MyApplication app = (MyApplication) this.getApplication();  //获取MyApplication实例  
  2.             HttpClient client = app.getHttpClient();    //获取HttpClient实例 
使用完client不必关闭连接,因为整个app只有一个HttpClient,它为整个app服务的,到app退出时候会自动关闭。

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



0 0
原创粉丝点击