`
chriszeng87
  • 浏览: 717168 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android开发实现HttpClient工具类

阅读更多

在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务。你可以把HttpClient想象成一个浏览器,通过它的API我们可以很方便的发出GET,POST请求(当然它的功能远不止这些)。 
  比如你只需以下几行代码就能发出一个简单的GET请求并打印响应结果: 

  

Java代码  收藏代码
  1. try {  
  2.           // 创建一个默认的HttpClient  
  3.           HttpClient httpclient = new DefaultHttpClient();  
  4.           // 创建一个GET请求  
  5.           HttpGet request = new HttpGet("www.google.com");  
  6.           // 发送GET请求,并将响应内容转换成字符串  
  7.           String response = httpclient.execute(request, new BasicResponseHandler());  
  8.           Log.v("response text", response);  
  9.       } catch (ClientProtocolException e) {  
  10.           e.printStackTrace();  
  11.       } catch (IOException e) {  
  12.           e.printStackTrace();  
  13.       }  



  为什么要使用单例HttpClient? 
  这只是一段演示代码,实际的项目中的请求与响应处理会复杂一些,并且还要考虑到代码的容错性,但是这并不是本篇的重点。注意代码的第三行: 

  

Java代码  收藏代码
  1. HttpClient httpclient = new DefaultHttpClient();  



  在发出HTTP请求前,我们先创建了一个HttpClient对象。那么,在实际项目中,我们很可能在多处需要进行HTTP通信,这时候我们不需要为每个请求都创建一个新的HttpClient。因为之前已经提到,HttpClient就像一个小型的浏览器,对于整个应用,我们只需要一个HttpClient就够了。看到这里,一定有人心里想,这有什么难的,用单例啊!!就像这样: 

  

Java代码  收藏代码
  1. public class CustomerHttpClient {  
  2.       private static HttpClient customerHttpClient;  
  3.       
  4.       private CustomerHttpClient() {  
  5.       }  
  6.       
  7.       public static HttpClient getHttpClient() {  
  8.           if(null == customerHttpClient) {  
  9.               customerHttpClient = new DefaultHttpClient();  
  10.           }  
  11.           return customerHttpClient;  
  12.       }  
  13.   }  



  多线程!试想,现在我们的应用程序使用同一个HttpClient来管理所有的Http请求,一旦出现并发请求,那么一定会出现多线程的问题。这就好像我们的浏览器只有一个标签页却有多个用户,A要上google,B要上baidu,这时浏览器就会忙不过来了。幸运的是,HttpClient提供了创建线程安全对象的API,帮助我们能很快地得到线程安全的“浏览器”。 

  解决多线程问题 

  

Java代码  收藏代码
  1. public class CustomerHttpClient {  
  2.       private static final String CHARSET = HTTP.UTF_8;  
  3.       private static HttpClient customerHttpClient;  
  4.   
  5.       private CustomerHttpClient() {  
  6.       }  
  7.   
  8.       public static synchronized HttpClient getHttpClient() {  
  9.           if (null == customerHttpClient) {  
  10.               HttpParams params = new BasicHttpParams();  
  11.               // 设置一些基本参数  
  12.               HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
  13.               HttpProtocolParams.setContentCharset(params,  
  14.                       CHARSET);  
  15.               HttpProtocolParams.setUseExpectContinue(params, true);  
  16.               HttpProtocolParams  
  17.                       .setUserAgent(  
  18.                               params,  
  19.                               "Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "  
  20.                                       + "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");  
  21.               // 超时设置  
  22.               /* 从连接池中取连接的超时时间 */  
  23.               ConnManagerParams.setTimeout(params, 1000);  
  24.               /* 连接超时 */  
  25.               HttpConnectionParams.setConnectionTimeout(params, 2000);  
  26.               /* 请求超时 */  
  27.               HttpConnectionParams.setSoTimeout(params, 4000);  
  28.               
  29.               // 设置我们的HttpClient支持HTTP和HTTPS两种模式  
  30.               SchemeRegistry schReg = new SchemeRegistry();  
  31.               schReg.register(new Scheme("http", PlainSocketFactory  
  32.                       .getSocketFactory(), 80));  
  33.               schReg.register(new Scheme("https", SSLSocketFactory  
  34.                       .getSocketFactory(), 443));  
  35.   
  36.               // 使用线程安全的连接管理来创建HttpClient  
  37.               ClientConnectionManager conMgr = new ThreadSafeClientConnManager(  
  38.                       params, schReg);  
  39.               customerHttpClient = new DefaultHttpClient(conMgr, params);  
  40.           }  
  41.           return customerHttpClient;  
  42.       }  
  43.   }  



  在上面的getHttpClient()方法中,我们为HttpClient配置了一些基本参数和超时设置,然后使用ThreadSafeClientConnManager来创建线程安全的HttpClient。上面的代码提到了3种超时设置,比较容易搞混,故在此特作辨析。

 

 

转自:http://xierh21.iteye.com/blog/1236654

分享到:
评论

相关推荐

    Android-HttpClient工具类简单轻松的实现getpostput和delete请求

    HttpClient工具类,简单轻松的实现get,post,put和delete请求

    android开发揭秘PDF

    前言 第一部分 准备篇 ...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开发案例驱动教程 配套代码

    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...

    《Android应用开发揭秘》附带光盘代码.

     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 脚本引擎、音效模块、网络  模块  14.5 小结...

    《Android应用开发揭秘》源码

     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 脚本引擎、音效模块、网络模块  14.5 小结  ...

    Android应用开发揭秘pdf高清版

    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 脚本引擎、音效模块、网络 模块 14.5 小结 第15章 优化技术 ...

    Android ThinkAndroid开发框架.zip

    ThinkAndroid是一个免费的开源的、简易的、遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单、快速的进行 Android应用程序的开发,包含Android mvc、简易sqlite orm、ioc模块、封装Android httpclitent...

    Android项目源码ThinkAndroid开发框架.zip

    ThinkAndroid是一个免费的开源的、简易的、遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单、快速的进行 Android应用程序的开发,包含Android mvc、简易sqlite orm、ioc模块、封装Android httpclitent...

    Android典型技术模块开发详解

    第一篇 Android开发初步 第1章 Android初识 1.1 Android简介 1.1.1 认识Android 1.1.2 Android系统框架 1.1.3 应用程序框架 1.2 Eclipse开发环境 1.2.1 安装ADT插件 1.2.2 安装SDK 1.2.3 配置源代码 1.2.4 创建AVD ...

    Android开发资料合集-World版!

    9.40、通过HTTPCLIENT从指定SERVER获取数据 265 9.41、通过FTP传输文件,关闭UI获得返回码 266 9.42、激活JAVASCRIPT打开内部链接 266 9.43、清空手机COOKIES 267 9.44、检查SD卡是否存在并且可以写入 267 9.45、...

    Android 常用六大框架

    1、volley ... (1) JSON,图像等的异步下载; (2) 网络请求的排序(scheduling) (3) 网络请求的优先级处理 (4) 缓存 (5) 多级别取消请求 (6) 和Activity和生命周期的联动(Activity结束时... (10) 一系列工具类

    疯狂Android讲义源码

     1.2 搭建Android开发环境 5  1.2.1 下载和安装Android SDK 5  1.2.2 安装Eclipse和ADT插件 7  1.3 Android常用开发工具的用法 10  1.3.1 创建、删除和浏览AVD 10  1.3.2 使用Android模拟器  (Emulator) 14...

    Android 开发技巧

    9.40、通过HTTPCLIENT从指定SERVER获取数据 265 9.41、通过FTP传输文件,关闭UI获得返回码 266 9.42、激活JAVASCRIPT打开内部链接 266 9.43、清空手机COOKIES 267 9.44、检查SD卡是否存在并且可以写入 267 9.45、...

    精通ANDROID 3(中文版)1/2

    1.5 使用Android SDK开发最终用户应用程序  1.5.1 Android模拟器  1.5.2 Android UI  1.5.3 Android基础组件  1.5.4 高级UI概念  1.5.5 Android Service组件  1.5.6 Android媒体和电话组件  1.5.7 ...

    疯狂Android讲义.part2

    1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 1.3 Android常用开发工具的用法 10 1.3.1 创建、删除和浏览AVD 10 1.3.2 使用Android模拟器 (Emulator) 14 1.3.3 使用...

    疯狂Android讲义.part1

    1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 1.3 Android常用开发工具的用法 10 1.3.1 创建、删除和浏览AVD 10 1.3.2 使用Android模拟器 (Emulator) 14 1.3.3 使用...

Global site tag (gtag.js) - Google Analytics