美文网首页Rx系列android网络开发知识 | 解析
OkHttp, Retrofit, Volley应该选择哪一个?

OkHttp, Retrofit, Volley应该选择哪一个?

作者: stay4it | 来源:发表于2016-04-06 20:57 被阅读26299次

今天在知乎看到一个问题,忍不住去回答了。

也在这里写一份:okhttp,retrofit,android-async-http,volley应该选择哪一个?

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

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人数多的情况下,总得有个完全精通的吧,万一掉坑里了呢。。。

就说这么多啦,选最适合项目的,选大多数人选择的,选简单易用的,就这么个标准。

关于Retrofit源码分析可以看我另外一些文章
Retrofit分析-漂亮的解耦套路
Retrofit分析-经典设计模式案例

没耐心自己分析源码的同学,还可以参考Stay录制的视频版
Retrofit分析-漂亮的解耦套路(视频版)

另外怎么选择开源library,可以参考我的简书 这么多开源框架,该用哪个好?

相关文章

网友评论

  • wmjwmj:恍然大悟
  • 5c5113a4a475:而OkHttp 是基于http协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向真正的请求,跟HttpClient, HttpUrlConnection的职责是一样的。
    这个写的太好了
  • a36a9fcacf12:我不知怎么解耦 反正我API参数都是python build出的又不是自己写的233333 。okhttp已经够我用了。什么xml格式给他们再套个转json就算了。那么多框架学起就累。
  • ElvisHew:单纯的 retrofit+okhttp 还是不够,还是得自己根据各业务API的不同类型作进一步封装。retrofit 相当于 API 生成器,线程的调度执行需要靠别人(如各种 CallAdapter),volley 则是单纯的调度执行器,API 生成需要自己手写。如果项目中已经在大量使用 volley,但又想集成 retrofit 以让后面新增 API 时减少手写代码,那是不是可以有个 VolleyCallAdapter 呢?我还没用过 retrofit,请教一下博主的理解
    stay4it:@ElvisHew 稍微有点偏差,Volley封装的比较死,再串到retrofit中没有必要。建议你先使用下,有足够的体会之后再考虑它是否还需要封装
  • 09f85f57010e:sn: volley retrofit 或者自己封装okhttp
  • c27fc3ec38b9:一直在用android-async-http,个人感觉挺好用的,完全能满足项目需求,难道淘汰了吗 ? :sweat: 另外之前用的thrift也超级爽
    stay4it:@heroandy 因为它用的httpclient,淘汰的是httpclient,所以aysnchttp也被淘汰,每个框架都好用的,这里只比的是内部实现,
  • 99a3e443b0b3:好东西,谢谢分享
  • davidtps:分析的很棒
  • 键盘男:服务端不遵守restful规则,用retrofit就是蛋疼。OKHttp大势所趋!
    stay4it:@苦逼键盘男kkmike999 这个是converter干的事吧,有resonpseConverter,还有requestConverter,你可以自己写一套converter
    键盘男:@stay4it 我尝试过封装retrofit,但用起来还不如用OKhttp封装灵活。例如,你传入一个bean让封装好的http层拿出相应数据给服务端,用retrofit就超级蛋疼了
    stay4it:@苦逼键盘男kkmike999 这确实苦逼→_→ 只能自己简单的封装下了
  • 皮球二二:其实主要是线程切换方便选择OK或者retrofit,这个扩展支持volley是不具备的,并且volley只适合小而高并发,大文件就不优秀了
    b5a76e3d7e98:@stay4it 你这个回复相当牛逼
    e811a35be91f:@stay4it 这个回答不错。
    stay4it:@r17171709 对,不是所有的框架都是为了架构而架构的,这种情况很少。像volley就是为移动端为android而设计的,它就是为了满足简单轻便而设计的。像retrofit就是超级解耦,它就是个门面,不干实事,只做指挥,所以它能随意的切换子模块,子功能。它的设计就是为了满足无限的可能性。架构的目的不同,结果也不同,不能说volley没这些功能,volley就不如retrofit
  • 尹star:👍

本文标题:OkHttp, Retrofit, Volley应该选择哪一个?

本文链接:https://www.haomeiwen.com/subject/bjsmlttx.html