Android使用HttpClient请求服务器代码优化版
来源:互联网 发布:java 日期相差天数 编辑:程序博客网 时间:2024/06/06 09:46
版权声明:本文为博主原创文章,未经博主允许不得转载。转载注明出处:Sunzxyong
首先,我在前面的两篇博文中介绍了在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>
- MyApplication app = (MyApplication) this.getApplication(); //获取MyApplication实例
- HttpClient client = app.getHttpClient(); //获取HttpClient实例
其实上面不必使用单例模式,因为app创建时候就只会执行一次onCreate方法,只会生成一个HttpClient客户端。
- Android使用HttpClient请求服务器代码优化版
- Android使用HttpClient请求服务器代码优化版
- Android使用HttpURLConnection和HttpClient请求服务器数据
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- android使用apache httpclient发送post请求
- Android中使用httpClient实现HTTP请求
- 解决Android httpclient网络post/get请求性能优化
- android请求https(二)使用HttpClient 请求https
- HttpClient自动请求服务器类的简单使用
- Android:使用HttpClient访问HTTP/HTTPS服务器
- android的HttpClient请求
- Android httpclient 请求
- android---httpclient get请求
- HttpClient请求服务器 get post
- HttpClient ---------- 服务器请求外部service
- 使用HttpClient操作请求
- iOS异常捕获
- Unity Mesh合并插件MeshBaker使用心得(一)
- java.lang.IllegalArgumentException: MALFORMED 问题解决
- JavaScript对象之正则表达式-RegExp
- 观光旅游(floyed最小环)
- Android使用HttpClient请求服务器代码优化版
- Android沉浸式状态栏
- 编写类String的构造函数、析构函数和赋值函数
- LeetCode 349. Intersection of Two Arrays
- JMS入门(三)--Queue的使用
- win10下安装centos7双系统之开机系统引导问题
- QT快捷键
- CodeForces 612C Replace To Make Regular Bracket Sequence
- CSS user-select