(转)Android实战之你应该使用哪个网络库

摘要

摘自Android实战之你应该使用哪个网络库

最早的时候Android只有两个主要的HTTP客户端: HttpURLConnection, Apache HTTP Client。根据Google官方博客的内容,HttpURLConnection在早期的Android版本中可能存在一些Bug:

在Froyo版本之前,HttpURLConnection包含了一些很恶心的错误。特别是对于关闭可读的InputStream时候可能会污染整个连接池。

同样,Google官方并不想转到Apache HTTP Client中:

Apache HTTP Client中复杂的API设计让人们根本不想用它,Android团队并不能够有效地工作。

而对于大部分普通开发者而言,它们觉得应该根据不同的版本使用不同的客户端。对于Gingerbread(2.3)以及之后的版本,HttpURLConnection会是最佳的选择,它的API更简单并且体积更小。透明压缩与数据缓存可以减少网络压力,提升速度并且能够节约电量。当我们审视Google Volley的源代码的时候,可以看得出来它也是根据不同的Android版本选择了不同的底层的网络请求库:

1
2
3
4
5
6
7
8
9
if (stack == null) {
if (Build.VERSION.SDK_INT >= 9) {
stack = new HurlStack();
} else {
// Prior to Gingerbread, HttpUrlConnection was unreliable.
// See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}

二者之间的对比请参考Android访问网络,使用HttpURLConnection还是HttpClient?

不过这样会很让开发者头疼,2013年,Square为了解决这种分裂的问题发布了OkHttp。

网络库对比

OkHttp

OkHttp本质上是自定义了一套底层的网络请求架构,是直接架构与Java Socket本身而没有依赖于其他第三方库,因此开发者可以直接用在JVM中,而不仅仅是Android。为了简化代码迁移速度,OkHttp也实现了类似于HttpUrlConnection与Apache Client的接口。

目前OkHttp V2.5.0支持如下特性:

  • HTTP/2 以及 SPDY的支持多路复用

  • 连接池会降低并发连接数

  • 透明GZIP加密减少下载体积

  • 响应缓存避免大量重复请求

  • 同时支持同步的阻塞式调用与异步回调式调用

Volley

Volley主要架构在HttpUrlConnection之上,如果希望能够抓取图片或者JSON数据,Volley有自定义的抽象类型ImageRequest与JsonObjectRequest,可以自动转化为HTTP请求。

在某些情况下,OkHttp可以通过使用多线程来有更好的性能体现。不过如果现有的程序中已经用Volley做了顶层封装,那么也可以使用HttpStack implementation这个来使用OkHttp的请求与响应接口来替换HttpUrlConnection。

Retrofit

一个类型安全的HTTP客户端支持REST接口。

参考

  1. Android实战之你应该使用哪个网络库