Android网络库的比较:OkHTTP,Retrofit和Volley [关闭]


579

来自学习Android的iOS开发人员的两部分问题,该问题涉及一个Android项目,该项目将提出从JSON到图像到音频和视频流下载的各种请求:

  1. 在iOS上,我广泛使用了AFNetworking项目。是否有适用于Android的等效库?

  2. 我已经阅读了Square的OkHTTPRetrofit,以及Volley,但还没有与它们一起开发的经验。我希望有人可以为每个案例提供一些最佳用例的具体示例。根据我的阅读,似乎OkHTTP是这三个中最强大的,并且可以满足该项目的要求(如上所述)。


3
如果使用的是HttpUrlConnection的内部实现,则应考虑HttpUrlConnection在POST请求上使用静默重试。那给我造成了很多伤害。有关更多信息,请参见:stackoverflow.com/a/37675253/2061089
oli 2016年

1
如果任何人需要所有网络库的列表,都可以在我的博客文章androidredman.wordpress.com/2017/06/26/…
Manohar Reddy

Volley可以运行旧版Apache,HttpUrlConnection,Apache-4或OkHttp。Retrofit真正只在哪里运行OkHttp。改造容易得多。
–bitsabhi

Answers:


647

我希望有人可以为每个案例提供一些最佳用例的具体示例。

如果要与Web服务通信,请使用Retrofit。如果要下载图像,请使用对等库Picasso。如果需要执行Retrofit / Picasso之外的HTTP操作,请使用OkHTTP。

排球大致与Retrofit + Picasso竞争。从好的方面来说,它是一个库。不利的一面是,这是一个没有证件的,不受支持的“将代码扔在墙上,并在上面进行I | O演示”的库。

编辑-Volley现在由Google正式支持。请参考Google开发者指南

根据我的阅读,似乎OkHTTP是3种中最强大的

如果可用,Retrofit自动使用OkHTTP。杰克·沃顿(Jake Wharton)有一个要点,它将Volley连接到OkHTTP。

并可以满足该项目的要求(如上所述)。

按照“流”的传统定义,您可能不会将它们全部用于“流式下载音频和视频”。相反,Android的媒体框架将为您处理这些HTTP请求。

话虽如此,如果您打算尝试进行自己的基于HTTP的流传输,则OkHTTP应该可以处理这种情况。我不记得Volley将如何处理这种情况。Retrofit和Picasso都不是为此目的而设计的。


4
感谢@CommonsWare提供的简洁答案,以及有关Volley未记录的steez的注释(得到该印象,尤其是与其他项目相比)。绝对可以帮助我摆脱困境。
阿尔菲·汉森

18
@CommonsWare的另一个很好的答案。有人可以跟进RoboSpice如何适应所有这些吗?
user1923613

3
@ user1923613 github.com/octo-online/robospice如果您正在使用凌空进行网络通话,则无需使用robospice !,凌空可以完成Robospice进行网络通话的许多工作,Robospice开箱即用地支持REST(使用Spring Android或Google Http Client或Retrofit)。如果您希望通过强大的网络客户端进行快速联网和图像加载,可以进行排球!但是您可以替换使用Robospice的常规android异步任务,以获得更好的性能并避免内存泄漏!
LOG_TAG

4
@frostymarvelous:我觉得没有文件证明和无根据就绰绰有余了。并不是说Google缺少一个系统来更正式地处理类似这样的内容(例如Android支持库)。从得到这个答案以来的两年中,从积极的方面来说,社区提供了一些支持,包括将代码非正式地打包为工件。
CommonsWare 2015年

4
@AbhinavVutukuri:您正在评论两年多以前的答案。当时,没有文档。
CommonsWare

361

从Volley的角度看,这里有一些您需要的优点:

一方面,Volley完全专注于处理单个的小型HTTP请求。因此,如果您的HTTP请求处理有一些怪癖,Volley可能会为您提供帮助。另一方面,如果您在图像处理方面有一个怪癖,那么唯一拥有的真正钩子就是ImageCache。“也不是没有,但也不是很多!”。但它具有更多其他优点,例如,一旦定义了请求,就可以在片段或活动中使用请求,这与并行AsyncTasks一样轻松

凌空抽射的利弊:

那么Volley有什么好处呢?

  • 网络部分不仅用于图像。Volley旨在成为您后端不可或缺的一部分。对于基于简单REST服务的全新项目,这可能是一个巨大的胜利。

  • 与Picasso相比,NetworkImageView在请求清除方面更具攻击性,并且在GC使用模式方面更为保守。NetworkImageView仅依赖于强大的内存引用,并在对ImageView发出新请求时或在ImageView移出屏幕后立即清除所有请求数据。

  • 性能。这篇文章不会评估这种说法,但是他们显然已经谨慎考虑了它们的内存使用模式。Volley还努力将回调批处理到主线程,以减少上下文切换。

  • 齐射显然也有期货。如果有兴趣,请查看RequestFuture。

  • 如果您要处理高分辨率的压缩图像,Volley是这里唯一运作良好的解决方案。

  • Volley可以与Okhttp一起使用(新版本的Okhttp支持NIO以获得更好的性能)

  • 排球在“活动”生命周期中发挥了很好的作用。

Volley的问题:
由于Volley是新的,因此尚不支持某些功能,但已修复。

  1. 多部分请求(解决方案:https : //github.com/vinaysshenoy/enhanced-volley

  2. 状态代码201被视为错误,状态代码从200到207现在已成功响应。(修复:https : //github.com/Vinayrraj/CustomVolley

    更新:在谷歌抽射最新版本中,2xx状态代码错误是固定的,现在由于榕帕特里克!

  3. 它的文档较少,但是许多人在github中支持volley,可以在此处找到类似Java的文档。在android开发人员网站上,您可以找到使用Volley传输网络数据的指南。凌空源代码可以在Google Git中找到

  4. 要解决/更改Volley Framework的 重定向策略,请将Volley与OkHTTP配合使用(上面提到的CommonsWare)

您也可以阅读与毕加索比较《凌空凌空》的图像

改造:

它由Square发行,它提供了非常易于使用的REST API(更新:Voila!具有NIO支持)

改造的优点:

  • 与Volley相比,Retrofit的REST API代码简短,并提供了出色的API文档,并在社区中提供了良好的支持!添加到项目中非常容易。

  • 我们可以将其与任何带有错误处理的序列化库一起使用。

更新: -Retrofit 2.0.0-beta2中有很多非常好的更改

  • 改造的1.6版本OkHttp 2.0现在依赖于奥基奥以支持java.iojava.nio的,这使得它更容易访问,存储和使用处理您的数据的字节字符串缓冲区做一些聪明的事情,以节省CPU和内存。(供参考:这让我想起的Koush的OIN与NIO支持库!) 我们可以利用起来改造与RxJava结合起来,并用链条REST调用rxObservables避免难看的回调链(以避免回调地狱!)

版本1.6的缺点:

  • 与内存相关的错误处理功能不好(在Retrofit / OkHttp的较旧版本中),不确定带有Java NIO支持的Okio是否会对其进行改进。

  • 如果我们以不正确的方式使用它,则最少的线程帮助可能会导致回调。

(以上所有缺点都已在Retrofit 2.0 beta的新版本中解决)

================================================== ======================

更新:

Android Async,Volley和Retrofit性能基准(毫秒,值越低越好):

Android Async,Volley和Retrofit性能基准

(以上更新基准信息的FYI将通过Java NIO支持得到改善,因为新版本的OKhttp依赖于NIO Okio库)

在所有三个具有不同重复次数的测试中(1-25次),Volley的速度提高了50%至75%。翻新的速度比AsyncTasks快50%至90%,到达相同端点的次数相同。在Dashboard测试套件上,这转化为更快地加载/解析数据几秒钟。那是现实世界的巨大差异。为了使测试公平,AsyncTasks / Volley的时间包括了JSON解析,因为Retrofit会自动为您进行解析。

RetroFit在基准测试中获胜!

最后,我们决定将Retrofit用于我们的应用程序。它不仅快得离谱,而且与我们现有的体系结构非常吻合。我们能够制作一个父级回调接口,该接口可以自动执行错误处理,缓存和分页,而对我们的API几乎不需要付出任何努力。为了合并到Retrofit中,我们必须重命名变量以使我们的模型符合GSON规范,编写一些简单的接口,从旧的API中删除函数,并修改片段以不使用AsyncTasks。现在,我们已经完成了一些片段的完全转换,这非常轻松。我们不得不克服一些不断增长的痛苦和问题,但总体而言进展顺利。一开始,我们遇到了一些技术问题/错误,但是Square拥有一个出色的Google+社区,可以帮助我们解决这个问题。

什么时候使用Volley ?!

当我们需要加载图像以及使用REST API时,可以使用Volley !,同时需要多个n / w请求的同时需要网络调用排队系统!而且Volley具有比Retrofit更好的内存相关错误处理!

OkHttp可以与Volley一起使用,Retrofit 默认使用OkHttp!它具有SPDY支持,连接池,磁盘缓存,透明压缩!最近,它通过Okio库获得了对Java NIO的支持。

资料来源:信贷:Josh Ruesch先生的凌空对战改造

注意:关于流,它取决于您想要哪种流类型,例如RTSP / RTCP。


@ Jan1337z +1信息!我已经更新了!android.googlesource.com/platform/frameworks/volley
LOG_TAG

4
@LOG_TAG,在您的示例中对RoboSpice进行基准测试会很有趣。我们甚至提供了Retrofit模块,因此我相信这将需要很少的更改。资料来源是否存在?RS的优点是可以正确处理执行网络请求的活动的生命周期,并且我们还提供透明的缓存,我想与纯更新请求相比,开销会很小。
Snicolas 2014年

@Snicolas我是Josh Ruesch 博客提供的基准测试结果,您可以看到Ficus Kirkpatrick(Volley创始人)和Josh Ruesch之间的转换!他尚未在任何地方共享基准测试项目!仅供参考,我刚刚开始学习RoboSpice,并带有面对该通知问题的改装样品:)
LOG_TAG 2014年

3
嗨!关于Volley的多部分请求,我认为我们可以MultipartEntityBuilderhttpmime库中使用它。
2015年

2
是否有人验证了这些基准?由于M中不推荐使用apache http库(并且我将其用于multipart builder),因此我决定将网络代码迁移到Retrofit。最初,我更改了一个GET调用,以从服务器获取一堆对象。我为Retrofit vs AsyncTask计时(使用我自己的JSON解析)。该性能非常接近,没有如表的“一次讨论”列中所示提高3倍。当然,生成的代码更加简洁,我不必编写自己的JSON解析器,但是对于单个GET请求,并没有改善。
加里·基普尼斯

44

RoboSpice与 凌空抽射

来自https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ

  • RoboSpice(RS)是基于服务的,并且比Volley更尊重Android哲学。Volley是基于线程的,这不是在Android上进行后台处理的方式。最终,您可以挖掘两个库,发现它们非常相似,但是我们进行后台处理的方式更面向Android,例如,它允许我们告诉用户RS实际上是在后台做某事。很难抽射(实际上根本不行)。
  • RoboSpice和volley都提供了不错的功能,例如优先级划分,重试策略,请求取消。但是RS提供了更多功能:更高级的缓存,这是一个很大的缓存,它具有缓存管理,请求聚合,更多功能,例如重新插入挂起的请求,无需依赖服务器标头即可处理缓存过期等。
  • RoboSpice在UI Thread之外执行了更多操作:volley将在主线程上反序列化POJO,这在我看来是可怕的。使用RS,您的应用程序将响应更快。
  • 在速度方面,我们绝对需要指标。RS现在发展很快,但是我们仍然没有数字可言。理论上,Volley应该会快一点,但是RS现在是大规模并行的……谁知道呢?
  • RoboSpice通过扩展提供了广泛的兼容性范围。您可以将其与okhttp,retrofit,ormlite(beta),jackson,jackson2,gson,xml序列化器,google http客户端,spring android等结合使用。Volley可以与ok http一起使用,并使用gson。而已。
  • 排球比RS提供更多UI糖。Volley提供了NetworkImageView,RS提供了一个spicelist适配器。就功能而言,还不算很远,但是我相信Volley在这个话题上更先进。
  • 自RoboSpice最初发布以来,已经解决了200多个错误。它非常强大,并且在生产中大量使用。Volley还不成熟,但是其用户群应该快速增长(Google效应)。
  • RoboSpice在Maven Central上可用。凌空很难找到;)

Robospice使用android服务进行REST调用,我们可以将Robospice与Retrofit结合使用,以最小化gson解析工作,就像我们可以将Volley(基于踩踏)与Robospice一起使用一样?(不确定要问的是正确的qsn)我只是在搜索带服务的排球!
LOG_TAG 2014年

1
带服务的排球基本上是RS。或者,按时间顺序讲,Volley是RS,没有服务,缺少其他一些功能。是的,您可以将Retrofit与RS一起使用,如果愿意,还可以添加okhttp。
Snicolas 2014年

7
为什么齐射很难找到?compile 'com.mcxiaoke.volley:library:1.0.+'
罗布

1
@Rob曾经有一段时间mcxiaoke的克隆不可用。您必须在应用程序中手动包括凌空抽烟。
frostymarvelous 2015年

“ volley将在主线程上反序列化您的POJO”。如果有问题,您可以接收返回的JSON数据,并在另一个线程上自行反序列化。
AndroidDev

20

适用于Android的AFNetworking:

快速的Android网络这里

快速的Android网络库支持所有类型的HTTP / HTTPS请求,例如GET,POST,DELETE,HEAD,PUT,PATCH

快速的Android网络库支持下载任何类型的文件

快速的Android网络库支持上传任何类型的文件(支持分段上传)

快速的Android网络库支持取消请求

快速的Android网络库支持为任何请求(低,中,高,立即)设置优先级

快速的Android网络库支持RxJava

由于它使用OkHttp作为网络层,因此支持:

快速的Android网络库支持HTTP / 2支持,允许所有到同一主机的请求共享一个套接字

快速Android网络库使用连接池来减少请求延迟(如果HTTP / 2不可用)

透明的GZIP缩小下载大小

快速的Android网络库支持响应缓存,从而完全避免了网络重复请求

谢谢:图书馆是我创建的


1
您声明您的库支持HTTP / 2,但是没有说HTTP / 2支持是否有API要求。我的理解是,低于5.0的Android API级别没有支持HTTP / 2的正确SSL加密方法。不敲门,只是尝试全面评估您建议的解决方案。
DoctorD

@AmitShekhar:我只是想知道哪一个最适合在Android中进行API调用。我正在使用Android Networking Library,那么对实施Retrofit,Volley或Android Networking来说哪个很棒?
Parth Bhayani

@Amit Shekhar快速Android网络对多部分图像上传的效率如何,尤其是在互联网流量较低的情况下?
user3135923 '19

18

异步HTTP客户端loopj与Volley

我的项目的详细信息是每1-5分钟发送一次小的HTTP REST请求。

我长时间使用异步HTTP客户端(1.4.1)。与使用普通的Apache httpClient或HTTP URL连接相比,该性能更好。无论如何,新版本的库对我不起作用:库间异常剪切回调链。

阅读所有答案促使我尝试一些新事物。我选择了Volley HTTP库。

使用一段时间后,即使没有进行测试,我也清楚地看到响应时间下降到1.5倍,2倍凌空。

也许Retrofit比异步HTTP客户端更好?我需要尝试一下。但是我敢肯定,Volley不适合我。


关于Retrofit Vs AsyncHttpClient的任何分析 如果是,请发布@Sergey
IshRoid


我使用AsyncHttpClient几年了。不好的部分是,github回购是2年没有提交的。
维托·雨果·施瓦布

它不再实际,异步http太过时了。考虑更改到另一个库。排球也成为非常好的选择。
谢尔盖·瓦库连科

谢尔盖@IshRoid我仍然在寻找你的问题答辩,我应该用别的东西像RxJava改造或else..Please让我知道任何事情我使用AsyncHttpClient ..翘首等待响应
深戴夫

11

只是为了增加我在Volley工作中的经验而进行的讨论:

  1. Volley不会以任何方式处理流媒体上载或下载。也就是说,整个请求正文都必须在内存中,并且您不能像基本一样使用an OutputStream将请求正文写入基础套接字,也不能使用an InputStream来读取响应正文HttpURLConnection。因此,Volley是上传或下载大文件的不佳选择。您的要求和回应应该很小。这是我亲自遇到的凌空运动的最大局限之一。就其价值而言,OkHttp确实具有用于处理流的接口。

  2. 缺少官方文档很烦人,尽管我已经能够通过阅读源代码来解决此问题,这很容易理解。更麻烦的是,据我所知,Volley没有正式发行版本,也没有Maven或Gradle构件,因此,将其作为依赖项进行管理比任何Square发行的库都更加令人头疼。您只需克隆一个回购库,构建一个jar,就可以自己完成工作了。寻找错误修正?获取并希望它在那里。您可能还会得到其他一些东西。它不会被记录下来。我认为,即使代码库相当活跃,这实际上也意味着Volley是不受支持的第三方库。买者自负。

  3. 作为一种形式,将Content-Type绑定到类/请求类型(JsonObjectRequest,ImageRequest等)有点尴尬,并且由于将您绑定到Volley现有的Request类型层次结构,因此稍微降低了调用代码的灵活性。我喜欢直接将Content-Type设置为标头的简单性(顺便说一下,不要对Volley这样做;您最终将获得两个Content-Type标头!)。不过,那只是我个人的观点,可以解决。

这并不是说Volley没有某些有用的功能。当然可以。轻松自定义的重试策略,透明的缓存,取消API以及对请求调度和并发连接的支持都是很棒的功能。只知道它并不适用于所有HTTP用例(请参见上面的项目1),并且在应用程序中将Volley投入生产使用时涉及一些麻烦(项目2)。


满载内存是我慢慢杀死我的原因。感谢上帝,有人提到了它。
TheSunny

该库还可以为您的请求正文提供防御性副本,因此大型请求的内存消耗可能是您期望的两倍。
杰夫

9

我最近发现了一个名为ion的库,它为表带来了一些额外的好处。

ion具有对与ImageView,JSON(在GSON的帮助下),文件以及非常方便的UI线程支持集成的图像下载的内置支持。

我正在新项目上使用它,到目前为止效果很好。它的使用比Volley或Retrofit简单得多。


2
离子vs改造,您会推荐哪一种?
Sreekanth Karumanaghat

改造总比离子要好
Rajesh Kosht​​i

4

除了接受的答案和LOG_TAG所说的...之外,为了使Volley能够在后台线程中解析数据,您必须将其子类化,Request<YourClassName>因为onResponse在主线程上调用该方法,并且在主线程上进行解析可能会导致UI滞后大。在这里阅读如何做。


1
是的...当响应很大时,凌空解析主线程的响应,这会导致ui滞后。
Gopal Singh Sirvi,2015年

3

改装1.9.0与RoboSpice

我在我的应用程序中同时使用两者。

每当我解析嵌套的JSON类时,Robospice的运行速度都比Retrofit快。因为Spice Manger会为您做所有事情。在Retrofit中,您需要创建GsonConverter并将其反序列化。

我在同一活动中创建了两个片段,并使用两种相同的URL进行了相同的调用。

09-23 20:12:32.830  16002-16002/com.urbanpro.seeker E/RETROFIT   RestAdapter Init
09-23 20:12:32.833  16002-16002/com.urbanpro.seeker E/RETROFIT calling the method
09-23 20:12:32.837  16002-16002/com.urbanpro.seeker E/ROBOSPICE initialzig spice manager
09-23 20:12:32.860  16002-16002/com.urbanpro.seeker E/ROBOSPICE Executing the method
09-23 20:12:33.537  16002-16002/com.urbanpro.seeker E/ROBOSPICE on SUcceess
09-23 20:12:33.553  16002-16002/com.urbanpro.seeker E/ROBOSPICE gettting the all contents
09-23 20:12:33.601  16002-21819/com.urbanpro.seeker E/RETROFIT deseriazation starts
09-23 20:12:33.603  16002-21819/com.urbanpro.seeker E/RETROFIT deseriazation ends

2

还有另一个选择:https : //github.com/apptik/jus

  • 它像Volley一样是模块化的,但是扩展得更多,文档也在不断完善,支持不同的HTTP堆栈和转换器。
  • 它具有一个模块来生成服务器API接口映射,例如Retrofit
  • 它还具有JavaRx支持

以及许多其他方便的功能,例如标记,变压器等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.