说起Volley
、Retrofit
、OkHttp
相信基本没有人不知道。当然这里把OkHttp
放进来可能有些不恰当。
因为OkHttp
的官方介绍是An HTTP+HTTP/2 client for Android and Java applications
。
也就是说OkHttp
是基于http
协议封装的一套请求客户端。它是真正的网络请求部分,
与HttpClient
、HttpUrlConnection
是一样的,
但是显然它的效率非常高(说到这里顺便提一嘴,从android 4.4
开始HttpUrlConnection
内部默认使用的也是OkHttp
,
具体请参考之前的文章HttpUrlConnection详解)。
而Volley
、Retrofit
是控制请求的队列、切换、解析、缓存等逻辑。所以Volley
和Retrofit
都可以结合OkHttp
来使用。
在Android
开发中有很多网络请求框架,但是比较过来比较过去,最后最倾向的就是这两个:
Volley
:Google
发布的网络请求框架,专门为移动设备定制,小而美。Retrofit
:良心企业Square
由大神JakeWharton
主导的开源项目,是基于OkHttp
封装的一套Resetful
网络请求框架。Type-safe HTTP client for Android and Java by Square, Inc.
有关Volley
的介绍请看之前发布的文章Volley源码分析
这里就不分别介绍他俩了,直接说各自的优缺点:
-
Retrofit
使用起来更简单。而Volley
配置起来会稍微麻烦,因为Volley
可以使用HttpClient
、HttpUrlConnection
、OkHttp
我们需要根据自己的需求去配置。而Retrofit
只能结合OkHttp
使用。 -
Retrofit
依赖于OkHttp
,从而会导致它的包大小会比Volley
的大。 -
Volley
有很好的内存缓存管理,它在解析之前会将整个相应部分都加载到内存中,所以它对于小的网络请求非常合适,但是不支持post
大数据,所以不适合上传文件。而Retrofit
使用的是硬盘缓存,所以相比起从缓存这块来讲Retrofit
可能会更慢一些。 -
Retrofit
依赖于OkHttp
,而OkHttp
自身会避免同时两次请求同一个请求。所以Retrofit
同样会和Volley
一样去避免重复的请求,只不过它是在网络层来处理的。 -
Volley
在网络请求部分默认依赖于Apache HttpClient
。而Apache HttpClient
从API 23
开始已经在Android
中被移除并废弃了。这就是为什么很多开发者会认为Volley
已经过时了,因为Volley
并没有迁移到新的未废弃的代码。 -
默认情况下
Volley
会在DefaultRetryPolicy
中会将读取和连接的超时时间设置为2.5s
,并且对每次请求失败或者超时都有一次自动重试。 所以对于一些服务器响应可能会超过2s
的请求,开发者需要格外的小心下。Retrofit
的默认超时时间是10s
,而且它对失败或者超时的操作不会自动重试。 -
很多开发者都会说
Retrofit
会比Volley
更快。因为有人专门去测试过,其实这里是不严谨的。因为Volley
可以结合使用HttpUrlConnection
、HttpClient
、OkHttp
等来使用,而Retrofit
是用OkHttp
一起,所以如果你让Volley
结合OkHttp
之后再来测试你就会发现总体来说其实他们不相上下。 -
Volley
实现了很完善的Activity
声明周期管理。
虽然Volley
之前也有一些问题,但是它们也都被各个大神修复。
所以综合起来说使用Volley+OKHttp
的组合是非常不错的,既可以保证速度又可以满足对缓存、重试等的处理。但是如果你是RxJava
的使用者那你可能会更偏向于使用Retrofit
,因为Retrofit
可以无缝结合RxJava
使用。目前主流的一套框架就是Retrofit + OkHttp + RxJava + Dagger2
,但是对使用者的要求也相对要高些。