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

  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中做如下配置:

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

Android使用HttpClient请求服务器代码优化版的更多相关文章

  1. HttpClient请求服务器代码优化版

    HttpClient请求服务器代码优化版 首先,我在前面的两篇博文中介绍了在 Android中,除了使用java.net包下HttpUrlConnection的API访问HTTP服务之外,我们还可以换 ...

  2. Android使用HttpUrlConnection请求服务器发送数据详解

    HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...

  3. Android使用HttpClient向服务器传输文件

    HttpClient是Apache Jakarta Common下的子项目,可以用来提供功能丰富的支持HTTP协议的客户端编程工具包,这几天写客户端的时候遇到个问题,“客户端需要向服务器发送Post请 ...

  4. android通过HttpClient与服务器JSON交互

    通过昨天对HttpClient的学习,今天封装了HttpClient类 代码如下: package com.tp.soft.util; import java.io.BufferedReader; i ...

  5. android通过httpClient请求获取JSON数据并且解析

    使用.net创建一个ashx文件,并response.write  json格式 public void ProcessRequest(HttpContext context) { context.R ...

  6. Android 实现 HttpClient 请求Https

    如题,默认下,HttpClient是不能请求Https的,需要自己获取 private static final int SET_CONNECTION_TIMEOUT = 5 * 1000; priv ...

  7. HttpClient请求服务器图片

    我们先引入一个IO流相关的Jar包, 从apache下载 下载后,jar包和源码如图: 我们只需要将jar包引入项目: 之后我们使用FileUtils这个类,其中有一个文件复制方法. 我们将请求的图片 ...

  8. android http post 请求与 json字符串

    一.目标 android客户端发送一个json格式的http的请求,期望得到服务端的一个json反馈. 1. 客户端发送的json格式为: {"data" : "valu ...

  9. Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)

    讲这个之前,我们先来说说get和post两种请求的区别吧!!! 1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.jsp?name=te ...

随机推荐

  1. STM32 - GPIO

    买了一个STM32F4的开发板,想把上面的东西重新学一下 快速过: 一.GPIO控制 void GPIO_DeInit(GPIO_TypeDef* GPIOx); //把某一个IO口恢复到默认值 /* ...

  2. [SHOI2008]堵塞的交通

    Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有 ...

  3. [USACO12FEB]牛的IDCow IDs

    题目描述 Being a secret computer geek, Farmer John labels all of his cows with binary numbers. However, ...

  4. 51nod 1179 最大的最大公约数

    1179 最大的最大公约数 题目来源: SGU 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给出N个正整数,找出N个数两两之间最大公约数的最大值.例如:N = ...

  5. OCP 认证考试报名费技巧题库051052053解析合格线

    本人于2017年4月22日通过参加OCP考试,第一次参加,一天之内考了三门,三门一次性通过,052 - 95% ,053 - 86% ,051 - 100% 一.关于考试考试报名费: 052:158$ ...

  6. 单选、多选框根据value值设置选中

    $("input:checkbox[value='video']").parent().addClass('checked'); $("input:radio[value ...

  7. php中AJAX请求中使用post和get请求的区别

    之前使用这两个请求的时候,主要从几个方面考虑: 1.语义,get就是从服务器获取,一般就是获取/查询资源信息.post就是提交给服务器,一般就是更新资源信息. 2.请求文件大小,get一般只有2k这样 ...

  8. 前端开发利器VSCode

    最近找到一款非常好用的开发利器,VSCode.一直认为微软做的东西都很一般,这个软件让我刮目相看了. 之前使用webstorm卡的不行,换了这个非常好用. 用着还不错,这里记录下一些使用的心得. VS ...

  9. 解决Mysql数据库拒绝远程连接和忘记密码的问题

    解决数据库忘记密码的问题 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 编辑m ...

  10. 如何搭建ssh服务?

    为了日后便于查询,本文所涉及到的所有命令集合如下: rpm -qa | grep openssh #查看是否安装了openssh软件 service sshd status #服务端的ssh状态 if ...