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,而后就能够用
其实上面没必要使用单例模式,由于app建立时候就只会执行一次onCreate方法,只会生成一个HttpClient客户端。优化