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,然后就可以用

  1. this

使用完client不必关闭连接,因为整个app只有一个HttpClient,它为整个app服务的,到app退出时候会自动关闭。

其实上面不必使用单例模式,因为app创建时候就只会执行一次onCreate方法,只会生成一个HttpClient客户端。

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

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

    首先,我在前面的两篇博文中介绍了在Android中,除了使用java.net包下HttpUrlConnection的API访问HTTP服务之外,我们还可以换一种途径去完成工作.Android SDK附 ...

  2. HttpClient请求服务器图片

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

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

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

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

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

  5. android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据

    主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...

  6. C# HttpClient 请求认证、数据传输笔记

    目录 一,授权认证 二,请求类型 三,数据传输 C# HttpClient 请求认证.数据传输笔记 一,授权认证 客户端请求服务器时,需要通过授权认证许可,方能获取服务器资源,目前比较常见的认证方式有 ...

  7. .NET Core HttpClient请求异常详细情况分析

    前言 最近项目上每天间断性捕获到HttpClient请求异常,感觉有点奇怪,于是乎观察了两三天,通过日志以及对接方沟通确认等等,查看对应版本源码,尝试添加部分配置发布后,观察十几小时暂无异常情况出现, ...

  8. zzy:请求静态资源和请求动态资源, src再次请求服务器资源

    [总结可以发起请求的阶段:请求动态资源:通过web.xml匹配action然后,自定义Servlet处理该action1)form表单提交请求的时候,用action设定,该页面发起请求的Servlet ...

  9. httpclient请求方法

    /** * httpclient请求方法 * @param url 请求地址 * @param paramMap 请求参数 * @param ent 编码格式 gbk.utf-8 * @return ...

随机推荐

  1. Android:解决client从server上获取数据乱码的方法

    向server发送HTTP请求.接收到的JSON包为response,用String content = EntityUtils.toString(response.getEntity()," ...

  2. 进阶: 案例八: Drag and Drop(动态)

    1.节点 2.UI 3. 4.方法: METHOD wddomodifyview . DATA: lo_container TYPE REF TO cl_wd_uielement_container, ...

  3. Lazy Math Instructor

      Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3721   Accepted: 1290 Description A m ...

  4. fzu 1909 An Equation(水题)

    题目链接:fzu 1909 An Equation 典型的签到题. #include <stdio.h> #include <string.h> bool judge(int ...

  5. 【ASP.NET Web API教程】2.4 创建Web API的帮助页面

    原文:[ASP.NET Web API教程]2.4 创建Web API的帮助页面 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 2.4 ...

  6. Boost下载安装编译配置使用指南(含Windows和Linux

    理论上,本文适用于boost的各个版本,尤其是最新版本1.45.0:适用于各种C++编译器,如VC6.0(部分库不支持),VS2003,VS2005,VS2008,gcc,C++ Builder等.先 ...

  7. CListCtrl插入数据避免闪烁

    1.锁定窗口,不进行刷新 m_list.LockWindowUpdate(); 2.设定列表不进行重画 m_list.SetRedraw(FALSE); 3.清空列表,删除历史数据 m_list.De ...

  8. 介绍SAP预留函数创建搜索帮助

    紧接上一节介绍的SAP预定义的出口函数F4IF_SHLP_EXIT_EXAMPLE创建搜索帮助, 该函数主要有两个部分: Changing接口的参数属性如下: SHLP:搜索帮助的基础描述,包括搜索帮 ...

  9. ALV判断修改后是否有不合法数据,有则选中错误行,高亮度显示。

    alv数据表维护表时错误行需要高亮度显示 gt_index_rows TYPE lvc_t_row,"用以存放要选择行的内表 gs_index_rows TYPE lvc_s_row.&qu ...

  10. Tomcat详细用法学习(一)

    在之前有关Tomcat的随笔<Tomcat免安装版的环境变量配置以及Eclipse下的Tomcat配置和测试>和<其他主机连接本地主机Tomcat会出现的防火墙问题>中已经详细 ...