Android使用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,然后就可以用
- MyApplication app = (MyApplication) this.getApplication(); //获取MyApplication实例
- HttpClient client = app.getHttpClient(); //获取HttpClient实例
使用完client不必关闭连接,因为整个app只有一个HttpClient,它为整个app服务的,到app退出时候会自动关闭。
其实上面不必使用单例模式,因为app创建时候就只会执行一次onCreate方法,只会生成一个HttpClient客户端。
Android使用HttpClient请求服务器代码优化版的更多相关文章
- HttpClient请求服务器代码优化版
HttpClient请求服务器代码优化版 首先,我在前面的两篇博文中介绍了在 Android中,除了使用java.net包下HttpUrlConnection的API访问HTTP服务之外,我们还可以换 ...
- Android使用HttpUrlConnection请求服务器发送数据详解
HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...
- Android使用HttpClient向服务器传输文件
HttpClient是Apache Jakarta Common下的子项目,可以用来提供功能丰富的支持HTTP协议的客户端编程工具包,这几天写客户端的时候遇到个问题,“客户端需要向服务器发送Post请 ...
- android通过HttpClient与服务器JSON交互
通过昨天对HttpClient的学习,今天封装了HttpClient类 代码如下: package com.tp.soft.util; import java.io.BufferedReader; i ...
- android通过httpClient请求获取JSON数据并且解析
使用.net创建一个ashx文件,并response.write json格式 public void ProcessRequest(HttpContext context) { context.R ...
- Android 实现 HttpClient 请求Https
如题,默认下,HttpClient是不能请求Https的,需要自己获取 private static final int SET_CONNECTION_TIMEOUT = 5 * 1000; priv ...
- HttpClient请求服务器图片
我们先引入一个IO流相关的Jar包, 从apache下载 下载后,jar包和源码如图: 我们只需要将jar包引入项目: 之后我们使用FileUtils这个类,其中有一个文件复制方法. 我们将请求的图片 ...
- android http post 请求与 json字符串
一.目标 android客户端发送一个json格式的http的请求,期望得到服务端的一个json反馈. 1. 客户端发送的json格式为: {"data" : "valu ...
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
讲这个之前,我们先来说说get和post两种请求的区别吧!!! 1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.jsp?name=te ...
随机推荐
- Mac OS X磁盘重新分区后 BootCamp Windows启动项丢失
前言 我有一台Mac,装有OS X和Windows两系统,因Windows和OS X都能读写exFAT分区, 故若在Machintosh HD和Windows HD之间开辟一个exFAT分区,可以作为 ...
- [POI 2007]ZAP-Queries
Description Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency) ...
- ●BZOJ 1416 [NOI2006]神奇的口袋
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1416题解: Pòlya瓦罐模型: 给定罐子里每种颜色的球的个数A[i],按题目要求随机操作若 ...
- 【NOIP2013】传染病控制
题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...
- java(MyEclipse)创建webservice和测试webservice
转载地址:http://blog.csdn.net/hsfy2012/article/details/46300921 创建并发布自己的Webservice的工具 1 安装MyEclipse 2 ...
- 关于导入excel问题
关于导入excel问题: 在VS中可以导入,部署在IIS上无法导入的原因: 1.可能部署IIS上发布的文件设置为只读,没有写入权限.解决方法为:设置程序发布的文件夹,添加写入权限,以及asp.net ...
- 华科机考:N阶楼梯上楼
时间限制:1秒空间限制:32768K 题目描述 N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入描述: 输入包括一个整数N,(1<=N<90). 输出描 ...
- ES6(数值)
数值处理新增特性: 1.新增方法 2.方法调整 1.二进制和八进制 二进制以 0b 开头,其中B和b都可以:八进制以 0o 开头,其中O和o都可以. 2.判断数值是否有效(有限) NaN为非数字,故为 ...
- Elasticsearch 学习(二):安装和使用
一.安装 安装 Elasticsearch 之前,需要先安装 Java,并配置好 Java 环境变量. 安装好 Java 环境后,进入 Elasticsearch 官网下载安装包. 解压安装包,进入解 ...
- python文件转exe
.py文件转exe文件 1.软件说明: 用python写一个视频处理软件,用到的库是moviepy 2.所用软件: Python 3.6.5 32位 pycharm 专门的python编辑ide,推 ...