转自:http://blog.csdn.net/xyz_lmn/article/details/7934316


网络编程在无线应用程序开发过程中起到了重要的作用。Android包括Apache HttpClient库,此库为执行Android中的网络操作之首选方法。Android还可允许通过标准的Java联网API(java.net包)来访问网络。即便使用Java.net包,也是在内部使用该Apache库。

       为了访问互联网,你的应用程序需要获取“android.permission.INTERNET”权限

Android中与网络相关的包

以下内容为Android SDK中与网络相关的部分包

• java.net

       提供联网相关的类,包括流和数据报套接字、互联网协议以及通用的HTTP处理。此为多用途的联网资源。经验丰富的Java开发人员可立即使用此惯用的包来创建应用程序。

• java.io

       尽管未明确联网,但其仍然非常重要。此包中的各种类通过其他Java包中提供的套接字和链接来使用,提供了IO流读写操作,它们也可用来与本地文件进行交互(与网络进行交互时经常发生)。

• java.nio

       包含表示具体数据类型的缓冲的各种类。便于基于Java语言的两个端点之间的网络通信。

• org.apache.*

        表示可为进行HTTP通信提供精细控制和功能的各种包。HTTP通信中都使用此包内容。

• android.net

       包括核心java.net.*类之外的各种附加的网络接入套接字。此包包括URL类,其通常在传统联网之外的Android应用程序开发中使用。

• android.net.http

       包含可操作SSL证书的各种类。

• android.net.wifi

       包含可管理Android平台中WiFi(802.11无线以太网)所有方面的各种类。并非所有的设备均配备有WiFi能力,尤其随着Android在对制造商(如诺基亚和LG)手机的翻盖手机研发方面取得了进展。

• android.telephony.gsm

        包含管理和发送短信(文本)消息所要求的各种类。随着时间的推移,可能将引入一种附加的包,以提供有关非GSM网络(如CDMA或类似android.telephony.cdma)的类似功能。




Apache HTTP Client

        DefaultHttpClient 以及其相关类 AndroidHttpClient 适用于 web browsers, 他们是可扩展的,并且拥有大量的稳定APIs。

            但是,在不破坏其兼容性的前提下很难对如此多的APIs做修改。因此,Android 团队对修改优化Apache HTTP Client表现的并不积极。


HttpURLConnect

       HttpURLConnect 是一个通用的、适合大多数应用的轻量级组件。这个类起步比较晚,很容易在主要API上做稳步的改善。

       HttpURLConnection在Froyo上存在一些bug,尤其是在读取 InputStream时调用 close()方法。解决这个bug,可参考如下代码:

[java]  view plain copy print ?
  1. private void disableConnectionReuseIfNecessary() {  
  2.     // HTTP connection reuse which was buggy pre-froyo  
  3.     if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {  
  4.         System.setProperty("http.keepAlive""false");  
  5.     }  
  6. }  

       在GingerBread中,HttpURLConnection的报文头中添加了对报文的压缩处理,包括请求报文和回复报文。

[java]  view plain copy print ?
  1. Accept-Encoding: gzip  

       Web服务器加上这个配置就可以支持报文的压缩,如果响应时的压缩产生问题,可参考doc文档关闭这个功能。

       HTTP的头信息的Content-Length返回的是压缩后的大小,使用getContentLength()返回未压缩字节的大小。因此从响应数据读取字节直到 InputStream.read()返回-1,这样可以获取响应数据的大小。


       GingerBread的HTTPS也做了几项改进,HttpsURLConnection能够连接支持多个HTTPS主机共享一个IP 的服务器Server Name Indication (SNI)。它支持压缩和session,如果连接失败,他会取消压缩和session属性自动重连。这样保证了HttpsURLConnection在支持老版本的前提下支持新的服务器。


在Ice Cream Sandwich中,增加了缓存机制,使用缓存,HTTP requests需要满足一下三种方式之一。

1、没有网络连接时使用本地缓存获取响应。

2、比如,获取一张图片,客户端发起请求,如果服务端没有修改,则使用缓存数据。

3、没有及时的获取到响应数据,可以使用缓存。


       如果想使用早期的Android版本支持缓存,可以使用java的反射机制。代码如下:


[java]  view plain copy print ?
  1. private void enableHttpResponseCache() {  
  2.     try {  
  3.         long httpCacheSize = 10 * 1024 * 1024// 10 MiB  
  4.         File httpCacheDir = new File(getCacheDir(), "http");  
  5.         Class.forName("android.net.http.HttpResponseCache")  
  6.             .getMethod("install", File.classlong.class)  
  7.             .invoke(null, httpCacheDir, httpCacheSize);  
  8.     } catch (Exception httpResponseCacheNotAvailable) {  
  9.     }  
  10. }  


      你也应该配置Web服务器支持缓存属性。


Which client is best?

        在Eclair 和 Froyo上Apache HTTP client拥有更少的bug,更好的稳定想,因此它是最好的选择。
        在Gingerbread以及以后的版本中,HttpURLConnection是最好的选择,它简单的api以及轻量级非常适合Android。压缩和缓存机制降低了网路使用,提高了速度、节省了电量。新的应用应该选择使用HttpURLConnection,我们也将做持续的改进。

原文地址: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

更多相关文章

  1. android 自带的主题 theme 的使用
  2. android:windowSoftInputMode属性使用
  3. Android(安卓)中 CheckBox 的基本使用
  4. 使用ListView实现网上订餐首页
  5. 常用的android权限配置和常用工具代码
  6. 【转】Android自定义属性,attr format取值类型
  7. Android(安卓)SeekBar自定义使用图片和颜色显示
  8. Android进度条控件ProgressBar使用
  9. Android(安卓)使用PdfDocument生成PDF文件及遇到的问题

随机推荐

  1. android布局layout中的一些属性
  2. Android(安卓)设置控件是否可见
  3. android开发之设置Edittext密码的方法
  4. Android布局文件中命名空间的解析
  5. Android布局文件中命名空间的解析
  6. Android(安卓)线程优先级设置方法
  7. android 滚动条 相关属性
  8. Android分享文稿 ( by quqi99 )
  9. Android,UI主线程与子线程
  10. android WebView总结