android 框架 okhttp nohttp volley
http://www.cocoachina.com/android/20170517/19296.html
https://blog.csdn.net/lyz_zyx/article/details/72870418
okhttp,retrofit,android-async-http,volley应该选择哪一个?
okhttp,retrofit,android-async-http,volley应该选择哪一个?
29 个回答
- 个人比较推荐Square开源组合,用Retrofit(目前已经是2.0+)+OkHttp基本上已经可以处理任何业务场景了,Square开源库质量还是值得信赖的。
Retrofit的特点我个人认为是简化了网络请求流程,同时自己内部对OkHtttp客户端做了封装,同时2.x把之前1.x版本的部分不恰当职责都转移给OkHttp了(例如Log,目前用OkHttp的Interceptor来实现),这样的好处是职责清晰,Retrofit做自己该做的事儿。
而且Retrofit提供不同的Json Converter实现(也可以自定义),同时提供RxJava支持(返回Observable对象),配合Jackson(或者Gson)和RxJava,再加上Dagger2,你的效率至少可以提高一倍。
参见我之前的回答:OkHttp在安卓中的使用? - 知乎用户的回答
- 目前我所在的公司的技术栈没用到Volley和android-async-http,如果要用的话,估计还是要做一下二次封装的。
- 同时推荐用最新的Android Flux来架构你的Android程序,Facebook提出的架构,文档比较全,数据流总是单向的,飞。用过MVC,MVP,我还是是比较认同Flux的,而且之前公司用的架构模式跟Flux也比较像。
推荐一篇入门博客:AndroidFlux入门

我们来先说一个常识性的错误:
volley, retrofit, android-async-http 帮你封装了具体的请求,线程切换以及数据转换。
而OkHttp 是基于http协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向真正的请求,跟HttpClient, HttpUrlConnection的职责是一样的。
所以不要混淆。
-----以下纯个人主观见解
首先,我想即使你单纯使用OkHttp,还是会再包一层的,这样就等价于Volley之流的框架,只是封装的好与坏而已。
android-async-http内部实现是基于HttpClient, 想必你肯定知道6.0之后HttpClient是不是系统自带的了,不过它在最近的更新中将HttpClient的所有代码copy了一份进来,所以还能使用。
Volley是官方出的,volley在设计的时候是将具体的请求客户端做了下封装:HurlStack,也就是说可以支持HttpUrlConnection, HttpClient, OkHttp,相当于模版模式吧,这样解耦还是非常方便的,可以随意切换,如果你之前使用过Volley,并习惯使用,那直接写个OkHttp扩展就行了。
Retrofit因为也是square出的,所以大家可能对它更崇拜些。Retrofit的跟Volley是一个套路,但解耦的更彻底:比方说通过注解来配置请求参数,通过工厂来生成CallAdapter,Converter,你可以使用不同的请求适配器(CallAdapter), 比方说RxJava,Java8, Guava。你可以使用不同的反序列化工具(Converter),比方说json, protobuff, xml, moshi等等。
炒鸡解耦,里面涉及到超多设计模式,个人觉得是很经典的学习案例。虽然支持Java8, Guava你可能也不需要用到。xml,protobuff等数据格式你也可能不需要解析。but,万一遇到鬼了呢。
至于性能上,个人觉得这完全取决于请求client,也就是okhttp的性能,跟这些封装工具没太大关系。
至于RxJava,最好充分理解其原理之后再使用,别人云亦云,特别team人数多的情况下,总得有个完全精通的吧,万一掉坑里了呢。。。
就说这么多啦,选最适合项目的,选大多数人选择的,选简单易用的,就这么个标准。
另外怎么选择开源library,可以参考我的简书 这么多开源框架,该用哪个好?
------------
额,为了更清晰的描述retrofit,Stay大致的分析了retrofit源码。
流程图如下:

大家可以参考下。这么经典的设计模式示例,还是很少见的。
详情可参见:Retrofit分析-漂亮的解耦套路
链接:Android开源项目推荐之「网络请求哪家强」 - AndroidDeveloper - 知乎专栏
以下是原文:
不少人老催这个系列,好吧,今天就更新一篇干货给你们。网络请求这个话题基本是所有 App 开发都会遇到的,这也难怪之前很多人留言让我写写网络请求到底该怎么选择,今天就来说说网络请求到底哪家强!
1. 原则
本篇说的网络请求专指 http 请求,在选择一个框架之前,我个人有个习惯,就是我喜欢选择专注的库,其实在软件设计领域有一个原则叫做 「单一职责原则」,跟我所说的「专注」不谋而合,一个库能把一件事做好就很不错了。现如今有很多大而全的库,比如这个库可以网络请求,同时又可以图片加载,又可以数据存储,又可以 View 注解等等,我们使用这种库当然方便了,但是你有没有想过?这样会使得你整个项目对它依赖性太强,万一以后这个库不维护了,或者中间某个模块出问题了,这个影响非常大,而且我一直认为大而全的框架可能某一块都做的不够好,所以我在选择的时候更喜欢专注某一领域的框架。
在上面原则的基础上,所以目前来说单纯的网络请求库就锁定在了 Volley、OkHttp、Retrofit 三个,android-async-http 的作者已经不维护,所以这里就不多说了,下面我们分别来说说这三个库的区别。
2. OkHttp
我们知道在 Android 开发中是可以直接使用现成的 api 进行网络请求的,就是使用 HttpClient、HttpUrlConnection 进行操作,目前 HttpClient 已经被废弃,而 android-async-http 是基于 HttpClient 的,我想可能也是因为这个原因作者放弃维护。
而 OkHttp 是 Square 公司开源的针对 Java 和 Android 程序,封装的一个高性能 http 请求库,所以它的职责跟 HttpUrlConnection 是一样的,支持 spdy、http 2.0、websocket ,支持同步、异步,而且 OkHttp 又封装了线程池,封装了数据转换,封装了参数使用、错误处理等,api 使用起来更加方便。可以把它理解成是一个封装之后的类似 HttpUrlConnection 的一个东西,但是你在使用的时候仍然需要自己再做一层封装,这样才能像使用一个框架一样更加顺手。
OkHttp 的具体使用方法这里就不赘述,地址在这里:
http://square.github.io/okhttp/
3. Volley
Volley 是 Google 官方出的一套小而巧的异步请求库,该框架封装的扩展性很强,支持 HttpClient、HttpUrlConnection,甚至支持 OkHttp,具体方法可以看 Jake 大神的这个 Gist 文件:
https://gist.github.com/JakeWharton/5616899
而且 Volley 里面也封装了 ImageLoader ,所以如果你愿意你甚至不需要使用图片加载框架,不过这块功能没有一些专门的图片加载框架强大,对于简单的需求可以使用,对于稍复杂点的需求还是需要用到专门的图片加载框架。
Volley 也有缺陷,比如不支持 post 大数据,所以不适合上传文件。不过 Volley 设计的初衷本身也就是为频繁的、数据量小的网络请求而生!
关于 Volley 的具体用法可以见我很早在 GitHub 的一个 demo :
https://github.com/stormzhang/AndroidVolley
4. Retrofit
Retrofit 是 Square 公司出品的默认基于 OkHttp 封装的一套 RESTful 网络请求框架,不了解 RESTful 概念的不妨去搜索学习下,RESTful 可以说是目前流行的一套 api 设计的风格,并不是标准。Retrofit 的封装可以说是很强大,里面涉及到一堆的设计模式,你可以通过注解直接配置请求,你可以使用不同的 http 客户端,虽然默认是用 http ,可以使用不同 Json Converter 来序列化数据,同时提供对 RxJava 的支持,使用 Retrofit + OkHttp + RxJava + Dagger2 可以说是目前比较潮的一套框架,但是需要有比较高的门槛。
Retrofit 的具体使用方法与地址在这里:
http://square.github.io/retrofit/
5. Volley VS OkHttp
毫无疑问 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 本身封装的也更易用,扩展性更好些。
6. OkHttp VS Retrofit
毫无疑问,Retrofit 默认是基于 OkHttp 而做的封装,这点来说没有可比性,肯定首选 Retrofit。
7. Volley VS Retrofit
这两个库都做了非常不错的封装,但是 Retrofit 解耦的更彻底,尤其 Retrofit 2.0 出来,Jake 对之前 1.0 设计不合理的地方做了大量重构,职责更细分,而且 Retrofit 默认使用 OkHttp ,性能上也要比 Volley 占优势,再有如果你的项目如果采用了 RxJava ,那更该使用 Retrofit 。
所以说这两个库相比,Retrofit 毫无疑问更有优势,你在能掌握两个框架的前提下该优先使用 Retrofit。但是个人认为 Retrofit 门槛要比 Volley 稍高些,你要理解他的原理,各种用法,想彻底搞明白还是需要花些功夫的,如果你对它一知半解,那还是建议在商业项目使用 Volley 吧。
15个Android通用流行框架大全

1. 缓存
-
DiskLruCache Java实现基于LRU的磁盘缓存
2.图片加载
-
Android Universal Image Loader 一个强大的加载,缓存,展示图片的库
-
Picasso 一个强大的图片下载与缓存的库
-
Fresco 一个用于管理图像和他们使用的内存的库
-
Glide 一个图片加载和缓存的库
3. 图片处理
-
Picasso-transformations 一个为Picasso提供多种图片变换的库
-
Glide-transformations 一个为Glide提供多种图片变换的库
-
Android-gpuimage 基于OpenGL的Android过滤器
4. 网络请求
-
Android Async HTTP Android异步HTTP库
-
AndroidAsync 异步Socket,HTTP(客户端+服务器),WebSocket,和socket.io库。基于NIO而不是线程。
-
OkHttp 一个Http与Http/2的客户端
-
Retrofit 类型安全的Http客户端
-
Volley Google推出的Android异步网络请求框架和图片加载框架
5. 网络解析
-
Gson 一个Java序列化/反序列化库,可以将JSON和java对象互相转换
-
Jackson Jackson可以轻松地将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象
-
Fastjson Java上一个快速的JSON解析器/生成器
-
HtmlPaser 一种用来解析单个独立html或嵌套html的方式
-
Jsoup 一个以最好的DOM,CSS和jQuery解析html的库
6. 数据库
-
OrmLite JDBC和Android的轻量级ORM java包
-
Sugar 用超级简单的方法处理Android数据库
-
GreenDAO 一种轻快地将对象映射到SQLite数据库的ORM解决方案
-
ActiveAndroid 以活动记录方式为Android SQLite提供持久化
-
SQLBrite SQLiteOpenHelper 和ContentResolver的轻量级包装
-
Realm 移动数据库:一个SQLite和ORM的替换品
7. 依赖注入
-
ButterKnife 将Android视图和回调方法绑定到字段和方法上
-
Dagger2 一个Android和java快速依赖注射器。
-
AndroidAnotations 快速安卓开发。易于维护
-
RoboGuice Android平台的Google Guice
8. 图表
-
WilliamChart 创建图表的Android库
-
HelloCharts 兼容到API8的Android图表库
-
MPAndroidChart 一个强大的Android图表视图/图形库
9. 后台处理
-
Tape 一个轻快的,事务性的,基于文件的FIFO的库
-
Android Priority Job Queue 一个专门为Android轻松调度任务的工作队列
10. 事件总线
11. 响应式编程
-
RxJava JVM上的响应式扩展
-
RxJavaJoins 为RxJava提供Joins操作
-
RxAndroid Android上的响应式扩展,在RxJava基础上添加了Android线程调度
-
RxBinding 提供用RxJava绑定Android UI的API
-
Agera Android上的响应式编程
12. Log框架
13. 测试框架
-
Mockito Java编写的Mocking单元测试框架
-
Robotium Android UI 测试
-
Robolectric Android单元测试框架
Android自带很多测试工具:JUnit,Monkeyrunner,UiAutomator,Espresso等
14. 调试框架
-
Stetho 调试Android应用的桥梁,使得可以利用Chrome开发者工具进行调试
15. 性能优化
-
LeakCanary 内存泄漏检测工具
-
ACRA Android应用程序崩溃报告
浙公网安备 33010602011771号