本篇说的网络请求专指 http 请求,在选择一个框架以前,我我的有个习惯,就是我喜欢选择专一的库,其实在软件设计领域有一个原则叫作 「单一职责原则」,跟我所说的「专一」不谋而合,一个库能把一件事作好就很不错了。现现在有不少大而全的库,好比这个库能够网络请求,同时又能够图片加载,又能够数据存储,又能够 View 注解等等,咱们使用这种库固然方便了,可是你有没有想过?这样会使得你整个项目对它依赖性太强,万一之后这个库不维护了,或者中间某个模块出问题了,这个影响很是大,并且我一直认为大而全的框架可能某一块都作的不够好,因此我在选择的时候更喜欢专一某一领域的框架。android
在上面原则的基础上,因此目前来讲单纯的网络请求库就锁定在了 Volley、OkHttp、Retrofit 三个,android-async-http 的做者已经不维护,因此这里就很少说了,下面咱们分别来讲说这三个库的区别。git
咱们知道在 Android 开发中是能够直接使用现成的 api 进行网络请求的,就是使用 HttpClient、HttpUrlConnection 进行操做,目前 HttpClient 已经被废弃,而 android-async-http 是基于 HttpClient 的,我想可能也是由于这个缘由做者放弃维护。 github
而 OkHttp 是 Square 公司开源的针对 Java 和 Android 程序,封装的一个高性能 http 请求库,因此它的职责跟 HttpUrlConnection 是同样的,支持 spdy、http 2.0、websocket ,支持同步、异步,并且 OkHttp 又封装了线程池,封装了数据转换,封装了参数使用、错误处理等,api 使用起来更加方便。能够把它理解成是一个封装以后的相似 HttpUrlConnection 的一个东西,可是你在使用的时候仍然须要本身再作一层封装,这样才能像使用一个框架同样更加顺手。 web
OkHttp 的具体使用方法这里就不赘述,地址在这里: 设计模式
http://square.github.io/okhttp/api
Volley 是 Google 官方出的一套小而巧的异步请求库,该框架封装的扩展性很强,支持 HttpClient、HttpUrlConnection,甚至支持 OkHttp,具体方法能够看 Jake 大神的这个 Gist 文件:websocket
https://gist.github.com/JakeWharton/5616899网络
并且 Volley 里面也封装了 ImageLoader ,因此若是你愿意你甚至不须要使用图片加载框架,不过这块功能没有一些专门的图片加载框架强大,对于简单的需求可使用,对于稍复杂点的需求仍是须要用到专门的图片加载框架。 框架
Volley 也有缺陷,好比不支持 post 大数据,因此不适合上传文件。不过 Volley 设计的初衷自己也就是为频繁的、数据量小的网络请求而生! 异步
关于 Volley 的具体用法能够见我很早在 GitHub 的一个 demo :
https://github.com/stormzhang/AndroidVolley
Retrofit 是 Square 公司出品的默认基于 OkHttp 封装的一套 RESTful 网络请求框架,不了解 RESTful 概念的不妨去搜索学习下,RESTful 能够说是目前流行的一套 api 设计的风格,并非标准。Retrofit 的封装能够说是很强大,里面涉及到一堆的设计模式,你能够经过注解直接配置请求,你可使用不一样的 http 客户端,虽然默认是用 http ,可使用不一样 Json Converter 来序列化数据,同时提供对 RxJava 的支持,使用 Retrofit + OkHttp + RxJava + Dagger2 能够说是目前比较潮的一套框架,可是须要有比较高的门槛。
Retrofit 的具体使用方法与地址在这里:
http://square.github.io/retrofit/
毫无疑问 Volley 的优点在于封装的更好,而使用 OkHttp 你须要有足够的能力再进行一次封装。而 OkHttp 的优点在于性能更高,由于 OkHttp 基于 NIO 和 Okio ,因此性能上要比 Volley更快。
估计有些读者不理解 IO 和 NIO 的概念,这里姑且简单提下,这两个都是 Java 中的概念,若是我从硬盘读取数据,第一种方式就是程序一直等,数据读完后才能继续操做,这种是最简单的也叫阻塞式 IO,还有一种就是你读你的,我程序接着往下执行,等数据处理完你再来通知我,而后再处理回调。而第二种就是 NIO 的方式,非阻塞式。
因此 NIO 固然要比 IO 的性能要好了, 而 Okio 是 Square 公司基于 IO 和 NIO 基础上作的一个更简单、高效处理数据流的一个库。
理论上若是 Volley 和 OkHttp 对比的话,我更倾向于使用 Volley,由于 Volley 内部一样支持使用 OkHttp ,这点 OkHttp 的性能优点就没了,并且 Volley 自己封装的也更易用,扩展性更好些。
毫无疑问,Retrofit 默认是基于 OkHttp 而作的封装,这点来讲没有可比性,确定首选 Retrofit。
这两个库都作了很是不错的封装,可是 Retrofit 解耦的更完全,尤为 Retrofit 2.0 出来,Jake 对以前 1.0 设计不合理的地方作了大量重构,职责更细分,并且 Retrofit 默认使用 OkHttp ,性能上也要比 Volley 占优点,再有若是你的项目若是采用了 RxJava ,那更该使用 Retrofit 。
因此说这两个库相比,Retrofit 毫无疑问更有优点,你在能掌握两个框架的前提下该优先使用 Retrofit。可是我的认为 Retrofit 门槛要比 Volley 稍高些,你要理解他的原理,各类用法,想完全搞明白仍是须要花些功夫的,若是你对它只知其一;不知其二,那仍是建议在商业项目使用 Volley 吧。
因此综上,若是以上三种网络库你都能熟练掌握,那么优先推荐使用 Retrofit ,前提是最好大家的后台 api 也能遵循 RESTful 的风格,其次若是你不想使用或者没能力掌握 Retrofit ,那么推荐使用 Volley ,毕竟 Volley 你不须要作过多的封装,固然若是大家须要上传大数据,那么不建议使用 Volley,不然你该采用 OkHttp 。
最后,我知道可能有些人会纠结 Volley 与 OkHttp 的选择,那是由于我认为 OkHttp 仍是须要必定的能力作一层封装的,若是你有能力封装的话那不如直接用 Retrofit 了,若是没能力封装仍是乖乖的用 Volley 吧,若是你能有一些不错的基于 OkHttp 封装好的开源库,那么另说了,Volley 与 OkHttp 怎么选择随你便呗。
最最后,以上只是我一家之言,若有误导,概不负责!欢迎讨论与交流。