首先,我在前面的两篇博文中介绍了在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,然后就可以用

  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. JS点击按钮打开新的独立页面

    工作中遇到需要点击按钮弹出一个独立的页面,并显示指定内容的问题,查了一些资料后,得到以下方法: window.open('locationPage.html', '_blank', 'height=1 ...

  2. Python3玩转儿 机器学习(3)

    机器学习算法可以分为: 监督学习 非监督学习 半监督学习 增强学习 监督学习:给机器的训练数据拥有"标记"或者"答案",例如: 我们需要告诉机器左边的画面是一只 ...

  3. 什么是HTTP Referer?

    什么是Referer? Referer是 HTTP请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含 Referer.比如我在www.sojson ...

  4. [JLOI2015]城池攻占 左偏树

    题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi &l ...

  5. ●BZOJ 4822 [Cqoi2017]老C的任务

    题链: https://www.luogu.org/problemnew/show/P3755 (洛谷上数据范围给全了的) 题解: 树状数组,离线询问 (本来想弄一个二维树状数组/二维RMQ,然后直接 ...

  6. [Noi2016]网格

    来自FallDream的博客,未经允许,请勿转载,谢谢.   跳蚤国王和蛐蛐国王在玩一个游戏. 他们在一个 n 行 m 列的网格上排兵布阵.其中的 c 个格子中 (0≤c≤nm),每个格子有一只蛐蛐, ...

  7. Linux学习之CentOS(十一)-----Linux 账号管理(转)

    Linux 账号管理(转) useraddpasswdchageusermoduserdelfingerchfnchshidgroupaddgroupmodgroupdelgpasswd su(帐号切 ...

  8. new File()

    首先 File 类是对文件系统的映射 并不是硬盘上真实的文件所以 new File("xxx.xxx") 只是在内存中创建File文件映射对象,而并不会在硬盘中创建文件 如果需要创 ...

  9. Java Web -【分页功能】详解

    分页简介 分页功能在网页中是非常常见的一个功能,其作用也就是将数据分割成多个页面来进行显示. 使用场景: 当取到的数据量达到一定的时候,就需要使用分页来进行数据分割. 当我们不使用分页功能的时候,会面 ...

  10. 如何用cmd通过sublime打开文件?

    sublime 提供了专门的命令工具subl.exe,就在它的安装目录之下,讲安装目录配置到系统环境变量中就OK了.具体如下: 1.找到sublime安装路径 如我的默认路径:C:\Program F ...