`

Android中HTTP相关的API

阅读更多

        Android中大多数应用都会发送和接受HTTP请求,在Android API中主要由两个HTTP请求的相关类,一个是HttpURLConnection,另一个是Apache HTTP Client。这两个类实现的HTTP请求都支持HTTPS协议,基于流的上传和下载,可配置超时时间,IPv6和连接池。

Apache HTTP Client

DefaultHttpClient和同类的AndroidHttpClient都是可扩展的类。它们有大量且灵活的API,适用于网页浏览器开发。同时它们比较稳定并且bug较少。但是繁多的API的现实下,对其改善与保持兼容性不可得兼,明显Android团队的精力已然不在Apache HTTP Client。

HttpURLConnection

HttpURLConnection是一个通用,轻量的实现,可以满足大多数的程序进行HTTP请求。这个类虽然一开始比较简陋,但是其主要的几个API使得我们更容易进行稳定改善。

连接池污染

在冻酸奶(Android 2.2)之前,HttpURLConnection有着一些烦人的bug。最烦人的就是调用一个可读的InputStream的close方法会污染连接池。我们需要禁用连接池绕开这个问题,如下代码可以禁用连接池。

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

压缩数据与大小

从2.3开始,我们默认对返回的响应进行了压缩,HttpURLConnection会自动为发出去的请求加上Accept-Encoding: gzip这个头信息。如果gzip压缩的响应有问题,可以通过下面代码禁用gzip。

1
urlConnection.setRequestProperty("Accept-Encoding", "identity");

由于HTTP中的Content-Length头信息返回的是压缩后的大小,所以我们不能使用getContentLength()来计算未压缩数据的大小。正确的做法应该是读取HTTP响应中的字节,直到InputStream.read()方法返回为-1.

HTTPs改进

从Gingerbread开始,增加了对HTTPs链接的优化。在进行HTTPs请求之前,HttpsURLConnection会尝试使用服务器名字指示(Server Name Indication),这种技术可以让多个HTTPs主机共享一个IP地址。在HTTPs请求中,HttpsURLConnection也支持压缩和会话标签(Session Tickets)。一旦连接失败,HttpsURLConnection会不使用上面的三个特性进行重试。这样即可以保证在连接时高效率地连接到最新的服务器,也可以在不破坏兼容性的同时连接到旧服务器。

响应缓存

从4.0开始,HttpURLConnection引入了响应缓存机制。一旦缓存创建,后续的HTTP请求会按照下面情况处理

  • 完全缓存的响应会直接从本地存储中读取,响应很快,不需要网络连接。
  • 有条件的缓存必须由服务端进行freshness验证,比如client发出一个请求,如”Give me /foo.png if it changed since yesterday”,然后服务器端要么返回最新的内容,要么返回304未修改的状态。如果内容不变,则不下载。
  • 没有缓存的响应需要服务器处理,然后这些请求被缓存下来。

对于低于4.0的版本,我们可以使用反射开启响应的缓存机制

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

当然,这里还需要服务器端设置HTTP缓存相关的头信息。

哪家强

在2.3之前的版本,Apache的HTTP请求响应实现比较稳定,bug也少,所以在那些版本上它的最好。

但是在2.3之后,毫无疑问,HttpURLConnection是最好的。它API精简实用,默认支持压缩,响应缓存等。最重要的这是Android团队重点投入的,而Apache的版本已经被抛弃了。所以还是使用HttpURLConnection吧。

原文信息

分享到:
评论

相关推荐

    Android API中文文档

    Android API 中文文档 Android API 中文文档 Android API 中文文档 Android API 中文文档 Android API 中文文档 Android API 中文文档 Android API 中文文档 Android Android API 中文文档 中文文档Android API ...

    android SDK中添加自定义api

    在Android开发过程中,有时我们需要为SDK提供额外的功能或者扩展,这时就需要在Android SDK中添加自定义API。这个过程涉及到Java API的设计与JNI(Java Native Interface)的使用,以实现Java层与C/C++层的交互。...

    android官方api离线版

    10. **Android Studio集成开发环境**:Android Studio是Android开发的主要IDE,文档中包含了有关其特性、配置和调试技巧的信息。 这个离线版Android官方API文档是开发者日常编码的得力助手,无论是在没有网络的环境...

    android-serialport-api

    https://code.google.com/archive/p/android-serialport-api/

    Android中文API.rar

    Android.widget是Android API中的一类组件,用于构建UI界面。其中包含多种控件,如Button、TextView、EditText、ImageView等。例如,Button用于用户点击交互,TextView用于显示文本,EditText用于用户输入,...

    android中英文对照API

    在Android开发过程中,掌握API(应用程序接口)是至关重要的,因为它是构建应用程序的基础。API包含了各种类、方法和工具,让开发者能够与操作系统交互,实现功能丰富的应用。本资源提供了"android2.2完整版中文API...

    Android 2.2 API中文文档合集

    Android 2.2 API中文文档合集是一份极其宝贵的资源,尤其对于正在学习或从事Android应用开发的人员来说。这份文档集合包含了Android 2.2(API级别8)及部分2.3(API级别9)的详细中文翻译,旨在帮助开发者理解和使用...

    android的API合集(中英文) 官方下载

    Android API合集是Android开发者的重要参考资料,它包含了所有Android平台的接口、类库以及开发工具的详细说明。这个合集提供了中英文两个版本,对于中国开发者来说尤其方便,因为中文版可以帮助开发者更准确地理解...

    Android中文API合集

    《Android中文API合集》是为开发者精心整理的一份资源,包含了Android开发中常用的各种中文API文档,旨在帮助开发者更方便地理解和应用Android系统。这个合集分为两个版本,可能是针对不同的Android SDK版本或者更新...

    Android API中文文档 v2017.zip

    Android官方API文档完整中文版是一款官方推出的全中文完整API,Android API是一套可供调用的系统接口,在需要使用的时候必备一套Android官方中文API文档。 Android API中文文档基本简介 API(Application ...

    谷歌开源的串口类android-serialport-api

    在Android系统中,由于硬件和安全限制,直接访问串口并不像在桌面系统上那么简单,因此`android-serialport-api`提供了封装好的API来解决这个问题。 该库的核心功能包括: 1. **串口打开与关闭**:开发者可以通过...

    Android中文API合集 chm

    Android API提供了HttpURLConnection、OkHttp等网络库,支持HTTP/HTTPS请求。此外,还可以使用WebSocket进行实时通信,或者使用Volley、Retrofit等第三方库简化网络编程。 **多媒体** Android支持多媒体文件的播放...

    Android API中文帮助文档合集

    Android API中文帮助文档合集是为Android开发者提供的一份详尽的参考资料,旨在助力开发者更好地理解和使用Android平台的各种功能和接口。这份文档包含了从基础到高级的各类Android开发知识点,覆盖了系统架构、UI...

    android中文API文档大全

    Android中文API文档大全是开发者们不可或缺的资源,它包含了Android平台的所有主要组件、服务、接口以及工具的详细说明。这份文档旨在帮助中国开发者更轻松地理解和应用Android系统,避免语言障碍,提高开发效率。 ...

    Android官方中文翻译API文档

    在"Android中文翻译组——Android中文API合集(7).chm"文件中,开发者可以找到以下关键知识点: 1. **Android组件**:包括Activity(活动)、Service(服务)、Broadcast Receiver(广播接收器)和Content ...

    AndroidAPI文档完整版

    下面我们将深入探讨Android API文档中的关键知识点。 1. **Android SDK (Software Development Kit)** - Android SDK是开发Android应用的基础,包含了编译、调试工具以及必要的库文件。 - 它提供了Android平台的...

    Android 请求 WebAPI的案例

    在Android开发中,与WebAPI进行交互是常见的需求,例如获取服务器数据、发送用户信息等。本案例"Android请求WebAPI"将详细讲解如何在Android应用中实现这一功能。WebAPI通常指的是基于HTTP协议的RESTful API,允许...

    Android中文API,可在线更新

    在压缩包文件"AndroidBox0.5"中,包含了这个API的0.5版本源代码和其他相关资源。开发者可以下载并导入到他们的项目中,按照API文档的指引进行集成和使用。同时,为了方便开发者更好地理解和使用,API通常会包含示例...

Global site tag (gtag.js) - Google Analytics