okhttp,retrofit,android-async-http,volley应该选择哪一个

https://www.zhihu.com/question/35189851

首页发现话题

登录加入知乎

okhttp,retrofit,android-async-http,volley应该选择哪一个?

关注问题写回答

Android 开发

Android

Android 工程师

Android 应用设计

Android Studio

okhttp,retrofit,android-async-http,volley应该选择哪一个?

okhttp, retrofit, android-async-http, volley 这四个框架适用的场合?优缺点? 请给一些建议.我准备开发一个新的AP…显示全部

关注者

1,353

被浏览

96,987

关注问题写回答

​邀请回答

​1 条评论

​分享

29 个回答

默认排序​

Stay Zhang

Stay Zhang

stay4it.com

187 人赞同了该回答

我们来先说一个常识性的错误:

 

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分析-漂亮的解耦套路

编辑于 2016-04-07

​赞同 187​​14 条评论

​分享

​收藏​感谢收起​

lsxiao

lsxiao

www.gushiciwen.com

106 人赞同了该回答

  • 个人比较推荐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入门

编辑于 2016-01-21

​赞同 106​​6 条评论

​分享

​收藏​感谢收起​

stormzhang

stormzhang

公众号「stormzhang」,编程•职场•思维。

106 人赞同了该回答

刚好不少读者问这个问题,就写了一篇文章,这里偷个懒直接贴原文吧:

链接: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 吧。



8. 总结

所以综上,如果以上三种网络库你都能熟练掌握,那么优先推荐使用 Retrofit ,前提是最好你们的后台 api 也能遵循 RESTful 的风格,其次如果你不想使用或者没能力掌握 Retrofit ,那么推荐使用 Volley ,毕竟 Volley 你不需要做过多的封装,当然如果你们需要上传大数据,那么不建议使用 Volley,否则你该采用 OkHttp 。

 

最后,我知道可能有些人会纠结 Volley 与 OkHttp 的选择,那是因为我认为 OkHttp 还是需要一定的能力做一层封装的,如果你有能力封装的话那不如直接用 Retrofit 了,如果没能力封装还是乖乖的用 Volley 吧,如果你能有一些不错的基于 OkHttp 封装好的开源库,那么另说了,Volley 与 OkHttp 怎么选择随你便呗。

 

最最后,以上只是我一家之言,如有误导,概不负责!欢迎讨论与交流。

 

相关阅读:

Android开源项目推荐之「图片加载到底哪家强」

发布于 2016-08-08

​赞同 106​​17 条评论

​分享

​收藏​感谢收起​知乎用户

知乎用户

69 人赞同了该回答

okhttp是android平台最好的网络库,欢迎打脸。

  • volley是一个简单的异步http库,仅此而已。缺点是不支持同步,这点会限制开发模式;不能post大数据,所以不适合用来上传文件。
  • android-async-http。与volley一样是异步网络库,但volley是封装的httpUrlConnection,它是封装的httpClient,而android平台不推荐用HttpClient了,所以这个库已经不适合android平台了。
  • okhttp是高性能的http库,支持同步、异步,而且实现了spdy、http2、websocket协议,api很简洁易用,和volley一样实现了http协议的缓存。picasso就是利用okhttp的缓存机制实现其文件缓存,实现的很优雅,很正确,反例就是UIL(universal image loader),自己做的文件缓存,而且不遵守http缓存机制。
  • retrofit与picasso一样都是在okhttp基础之上做的封装,项目中可以直接用了。


另外

  • AndroidAsync这个网络库使用了nio的方式实现的。okhttp没有提供nio selector的方式,不过nio更适合大量连接的情况,对于移动平台有点杀鸡用牛刀的味道。
  • picasso、uil都不支持inbitmap,项目中有用到picasso的富图片应用需要注意这点。

编辑于 2016-03-04

​赞同 69​​30 条评论

​分享

​收藏​感谢收起​

陈启超

陈启超

15 人赞同了该回答

谢 

@韩啸

 邀请,话说你不是最近在做Okhttp和网络相关的研究吗?

第一,关于框架的优缺点,直接移步Stackoverflooooooow上的这个问答 Comparison of Android Networking Libraries: OkHTTP, Retrofit, Volley 如果还觉得看不懂,继续使用关键词 “okhttp vs volley vs retrofit ” 在Google搜索。

第二,题主没有说明开发什么类型的app,对于简单网络请求上面的基本都能满足需求,对于复杂网络请求,那么问题来了有多复杂? (逃

第三,每个开源或多或少会有各种坑,你要做的就是踩坑,填坑,再踩坑,再填坑....

最后附上一些视频参考

  1. 结束不久的Droidcon NYC 2015上Jake的关于Retrofit的演讲《Simple HTTP with Retrofit 2》https://www.youtube.com/watch?v=KIAoQbAu3eA
  2. Google_I_O_2013_-_Volley_Easy_Fast_Networking_for_Android
  3. 《Droidcon Montreal Jake Wharton - A Few Ok Libraries》https://www.youtube.com/watch?v=WvyScM_S88c&feature=youtu.be


答完感觉好像没什么X用,(逃

编辑于 2015-09-08

​赞同 15​​5 条评论

​分享

​收藏​感谢收起​QR Code of Downloading Zhihu App

下载知乎客户端

与世界分享知识、经验和见解

广告

相关问题

想学习C++,应该怎么开始入手? 11 个回答

该选择魅族16x还是15? 15 个回答

真正的兴趣社交应该是什么样子的? 27 个回答

怎么选择工作方向? 17 个回答

思维混乱,条理性差应该怎么提高? 110 个回答

相关推荐

live

周国平哲学私房课

周国平

共 22 节课

试听live

读书会特刊 | 找对方法好学习

4,042 人读过​阅读

广告

刘看山知乎指南知乎协议知乎隐私保护指引
应用工作申请开通知乎机构号
侵权举报网上有害信息举报专区
违法和不良信息举报:010-82716601
儿童色情信息举报专区
电信与服务业务经营许可证
网络文化经营许可证
联系我们 © 2019 知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值