在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务。你可以把HttpClient想象成一个浏览器,通过它的API我们可以很方便的发出GET,POST请求(当然它的功能远不止这些)。
比如你只需以下几行代码就能发出一个简单的GET请求并打印响应结果:
try {
// 创建一个默认的HttpClient
HttpClient httpclient = new DefaultHttpClient();
// 创建一个GET请求
HttpGet request = new HttpGet("www.google.com");
// 发送GET请求,并将响应内容转换成字符串
String response = httpclient.execute(request, new BasicResponseHandler());
Log.v("response text", response);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
为什么要使用单例HttpClient?
这只是一段演示代码,实际的项目中的请求与响应处理会复杂一些,并且还要考虑到代码的容错性,但是这并不是本篇的重点。注意代码的第三行:
HttpClient httpclient = new DefaultHttpClient();
在发出HTTP请求前,我们先创建了一个HttpClient对象。那么,在实际项目中,我们很可能在多处需要进行HTTP通信,这时候我们不需要为每个请求都创建一个新的HttpClient。因为之前已经提到,HttpClient就像一个小型的浏览器,对于整个应用,我们只需要一个HttpClient就够了。看到这里,一定有人心里想,这有什么难的,用单例啊!!就像这样:
public class CustomerHttpClient {
private static HttpClient customerHttpClient;
private CustomerHttpClient() {
}
public static HttpClient getHttpClient() {
if(null == customerHttpClient) {
customerHttpClient = new DefaultHttpClient();
}
return customerHttpClient;
}
}
多线程!试想,现在我们的应用程序使用同一个HttpClient来管理所有的Http请求,一旦出现并发请求,那么一定会出现多线程的问题。这就好像我们的浏览器只有一个标签页却有多个用户,A要上google,B要上baidu,这时浏览器就会忙不过来了。幸运的是,HttpClient提供了创建线程安全对象的API,帮助我们能很快地得到线程安全的“浏览器”。
解决多线程问题
public class CustomerHttpClient {
private static final String CHARSET = HTTP.UTF_8;
private static HttpClient customerHttpClient;
private CustomerHttpClient() {
}
public static synchronized HttpClient getHttpClient() {
if (null == customerHttpClient) {
HttpParams params = new BasicHttpParams();
// 设置一些基本参数
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params,
CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
HttpProtocolParams
.setUserAgent(
params,
"Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "
+ "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");
// 超时设置
/* 从连接池中取连接的超时时间 */
ConnManagerParams.setTimeout(params, 1000);
/* 连接超时 */
HttpConnectionParams.setConnectionTimeout(params, 2000);
/* 请求超时 */
HttpConnectionParams.setSoTimeout(params, 4000);
// 设置我们的HttpClient支持HTTP和HTTPS两种模式
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory
.getSocketFactory(), 443));
// 使用线程安全的连接管理来创建HttpClient
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(
params, schReg);
customerHttpClient = new DefaultHttpClient(conMgr, params);
}
return customerHttpClient;
}
}
在上面的getHttpClient()方法中,我们为HttpClient配置了一些基本参数和超时设置,然后使用ThreadSafeClientConnManager来创建线程安全的HttpClient。上面的代码提到了3种超时设置,比较容易搞混,故在此特作辨析。
分享到:
相关推荐
在Android开发中,HttpClient是一个常用的网络通信库,用于与服务器进行HTTP交互。虽然在Android API Level 23之后被标记为废弃,但仍有许多开发者选择继续使用它,因为它的功能强大且灵活。本篇文章将深入探讨...
本篇文章将详细讲解如何使用`HttpClient`工具类来简化这些网络请求的实现。 首先,我们需要引入`HttpClient`的相关依赖。在Android Studio中,如果使用的是旧版本的Android SDK(低于API 22),系统自带了`...
总的来说,`HttpClient`是Android开发中处理网络请求的重要工具,虽然现在有其他的替代方案,如OkHttp和Retrofit,但理解它的原理和使用方法对于开发者来说仍然是有益的。通过这个实例,你可以了解到网络通信的基本...
在Android开发中,工具类(Utils Class)是程序员经常创建的一种辅助代码结构,用来封装一些通用功能,提高代码的复用性和可维护性。这里提到的"Android 封装的工具类"涵盖了几种关键的模块,包括网络请求、数据库...
在Android开发过程中,工具类集合是非常重要的一部分,它们可以极大地提高开发效率,简化代码,使得开发者能够更加专注于业务逻辑。本篇文章将详细讲解"android常用工具类集合"中涉及的关键知识点,包括网络连接、...
在Android开发中,HTTP通信是应用与服务器交互的重要方式之一,`Android HttpClient`库就是用于实现这一功能的工具。本文将深入探讨如何使用`Android HttpClient`进行HTTP请求,包括GET、POST、PUT和DELETE等常见...
在Android开发中,HttpClient是一个重要的库,用于执行HTTP请求,获取网络上的数据。它允许开发者发送GET、POST等HTTP方法的请求,获取服务器响应,并处理返回的数据。在本示例中,HttpClient被用来从服务器获取数据...
HttpClient提供了一套完整的机制,可以设置请求头、处理Cookie、管理连接池,这在爬虫开发中非常有用。 在使用HttpClient时,有几个关键概念需要理解: 1. **HttpParams**: 这是用来设置HttpClient参数的对象,如...
在Android开发中,工具类是开发者经常会用到的辅助代码集合,它们可以帮助我们高效地处理各种常见任务。本文将深入探讨“android各种工具类”这一主题,包括文件操作、日期处理、图片处理、系统服务利用、网络通信...
总结,HttpClient是Android早期网络通信的重要工具,虽然在新版本中被HttpURLConnection替代,但其丰富的功能和灵活性仍使它在某些场景下具有价值。通过深入学习和使用HttpClient,开发者可以更好地掌握网络请求的...
在Android开发中,有时我们需要将本地的文件上传到服务器,例如图片、音频或者视频等。在本实例中,我们将探讨如何使用Apache的HttpClient库来实现这个功能。HttpClient是一个强大的HTTP客户端,它允许开发者发送...
前言 第一部分 准备篇 ...14.4.1 Activity类实现 14.4.2 流程控制和线程 14.4.3 游戏对象与对象管理 14.4.4 图形引擎 14.4.5 物理引擎 14.4.6 事件模块 14.4.7 工具模块 14.4.8 脚本引擎、音效模块、网络 模块
在Android开发中,进行HTTP通信是一项常见的任务,而Apache HttpClient是一个流行的选择,它提供了丰富的功能,包括文件上传。然而,Android原生的HttpClient并不支持Multipart/form-data类型的请求,这在上传文件时...
这个工具类通常会使用Apache的 HttpClient 或者OkHttp库来实现对WebDAV服务器的通信。 3. **Jackrabbit**: Jackrabbit是Apache基金会的一个开源项目,它提供了一个全面的Java Content Repository (JCR) 实现,也...
在Android开发中,网络通信是应用功能不可或缺的一部分。HttpClient是一个常用的网络请求库,尤其是在早期的Android版本中。本文将深入探讨Android中的HttpClientDemo及其在实际应用中的使用。 首先,我们来理解`...
在 Android 应用开发中,Broadcast(广播)、HttpClient 和 JSONParser 是三个关键的技术组件,用于实现不同功能间的通信、网络数据交互和数据解析。以下是对这三个技术的详细说明: 1. **Broadcast(广播)** ...
淘淘商城工具类.zip是一个包含一系列用于淘淘商城开发的工具类代码的压缩包。这些工具类通常是为了提高开发效率,...在实际开发过程中,开发者应当根据项目的具体需求选择和定制这些工具类,以实现最佳的性能和功能。
15.2.2 Java URL类实现方式 377 15.2.3 Apache HttpClient实现方式 378 15.3 数据交换格式 380 15.3.1 纯文本格式 381 15.3.2 XML格式 381 15.3.3 JSON格式 385 15.4 自定义服务器端程序实例 387 15.4.1 Java...
总结来说,`HttpClient`和`HttpPost`是Android开发中处理HTTP请求的重要工具,虽然已不再被官方推荐,但它们的稳定性和灵活性使其在某些情况下仍然具有较高的实用性。了解和掌握这些知识,可以帮助开发者更好地进行...