Android网络库的比较:OkHTTP,Retrofit和Volley

Alf*_*sen 563 networking android android-networking retrofit

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

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

  2. 我已经阅读了OkHTTP和Square的改造,以及Volley,但还没有与他们一起开发的经验.我希望有人可以提供一些最佳使用案例的具体例子.从我所看到的,看起来OkHTTP是三者中最强大的,并且可以处理这个项目的要求(如上所述).

Com*_*are 639

我希望有人可以提供一些最佳用例的具体例子.

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

Volley与Retrofit + Picasso大致竞争.从好的方面来说,它是一个图书馆.在负面,它是一个未记录的,一个不受支持的,"把代码扔到墙上并在它上面做一个I | O演示"库.

编辑 - 排球现在由谷歌正式支持.请参阅Google开发人员指南

从我所看到的,看起来OkHTTP是3中最强大的

如果可用,Retrofit会自动使用OkHTTP.Jake Wharton有一个Gist将Volley连接到OkHTTP.

并且可以处理该项目的要求(如上所述).

通过传统的"流媒体"定义,你可能不会将它们用于"音频和视频的流媒体下载".相反,Android的媒体框架将为您处理这些HTTP请求.

话虽这么说,如果你打算尝试自己的基于HTTP的流媒体,OkHTTP应该处理这种情况; 我不记得Volley如何处理这种情况.Retrofit和Picasso都不是为此设计的.

  • @CommonsWare的另一个很棒的答案.有人可以跟进RoboSpice如何适应所有这些吗? (18认同)
  • 感谢@CommonsWare提供简明的答案,以及有关Volley无证版steez的说明(得到的印象,特别是与其他项目相比).绝对可以帮助我解决问题. (4认同)
  • @frostymarvelous:我认为没有证据和不支持是足够的理由.这并不像谷歌缺乏更正式处理这样的东西的系统(例如,Android支持库).从这个答案开始的两年中,从好的方面来说,有一些社区支持,包括一些非正式的代码包装到工件中. (4认同)
  • @AbhinavVutukuri:您正在评论两年多前的回答.那时,没有文件. (4认同)
  • @ user1923613 https://github.com/octo-online/robospice如果你正在使用凌空进行网络呼叫,那么就不需要使用robospice !,凌空做了Robospice为网络呼叫做的许多事情,Robospice支持REST出来盒子(使用Spring Android或Google Http Client或Retrofit).如果你想通过强大的网络客户端进行快速网络和图像加载,你可以去排球!但是您可以使用Robospice替换正常的android异步任务,以获得更好的性能并避免内存泄漏! (3认同)
  • 如此真实!“将代码扔在墙上,并在上面进行I | O演示”库。:D (2认同)

LOG*_*TAG 354

从这里看Volley的观点可以满足您的要求:

一方面,Volley完全专注于处理个人的小型HTTP请求.因此,如果您的HTTP请求处理有一些怪癖,Volley可能会为您提供一个钩子.另一方面,如果你的图像处理有一个怪癖,你唯一真正的钩子是ImageCache."这不是什么,但也不是很多!".但它还有更多其他优点,例如一旦定义了请求,在片段或活动中使用它们就像并行AsyncTasks一样无痛

排球的利弊:

那么Volley有什么好看的?

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

  • 对于请求清理而言,NetworkImageView比Picasso更具攻击性,并且其GC使用模式更为保守.NetworkImageView完全依赖于强大的内存引用,并在为ImageView发出新请求时立即清除所有请求数据,或者在ImageView移出屏幕后立即清除.

  • 性能.这篇文章不会评估这个说法,但他们显然需要谨慎对待他们的内存使用模式.Volley还努力批量回调主线程以减少上下文切换.

  • 排球显然也有未来.如果您有兴趣,请查看RequestFuture.

  • 如果您正在处理高分辨率的压缩图像,那么Volley是唯一能够很好地运行的解决方案.

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

  • Volley与Activity生命周期相得益彰.

Volley的问题:
由于Volley是新的,很少有东西不支持,但它是固定的.

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

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

    更新:在Google排球的最新版本中,2XX状态代码错误现已修复!感谢Ficus Kirkpatrick!

  3. 它的记录较少,但很多人都在github上支持齐射,像文档这样的java可以在这里找到.在Android开发人员网站上,您可以找到使用Volley传输网络数据的指南.并且可以在Google Git上找到凌空源代码

  4. 解决/更改Volley Framework的重定向策略使用 Volley和OkHTTP(上面提到的CommonsWare)

你也可以通过Picasso阅读这个Comparing Volley的图像加载

改造:

它是由Square发布的,它提供了非常容易使用的REST API(更新:Voila!支持NIO)

改造的优点:

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

  • 我们可以将它与任何序列化库一起使用,并进行错误处理.

更新: - Retrofit 2.0.0-beta2有很多非常好的变化

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

版本1.6的改造的缺点:

  • 内存相关的错误处理功能并不好(在旧版本的Retrofit/OkHttp中)不确定它是否通过支持Java NIO的Okio得到了改进.

  • 如果我们以不正确的方式使用它,最小的线程辅助可能会导致回调地狱.

(以上所有缺点已在新版Retrofit 2.0 beta中得到解决)

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

更新:

Android Async vs Volley vs Retrofit性能基准测试(毫秒,更低值更好):

Android Async vs Volley vs Retrofit性能基准测试

(由于新版本的OKhttp依赖于NIO Okio库,因此可以通过Java NIO支持改进上面的Retrofit Benchmarks信息)

在所有三次不同重复测试(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支持,连接池,磁盘缓存,透明压缩!最近,它得到了一些支持java NIO和Okio库的支持.

来源,信用:Josh Ruesch先生的volley-vs- retrofit

注意:关于流式传输取决于您想要的流式传输类型,如RTSP/RTCP.

  • @LOG_TAG在您的样本中对RoboSpice进行基准测试会很有趣.我们甚至提供了一个Retrofit模块,所以我相信这需要很少的改变.源是否可以在某处获得?RS的优点是可以正确处理执行网络请求的活动的生命周期,我们还提供透明缓存,我想与纯粹的改造请求相比,开销会很小. (4认同)
  • 嗨!关于使用Volley的Multipart Requests,我认为我们可以在`httpmime`库中使用`MultipartEntityBuilder`. (3认同)
  • 是否有人验证了这些基准?由于M中不推荐使用apache http库(并且我将其用于multipart builder),因此我决定将网络代码迁移到Retrofit。最初,我更改了GET调用中的一个以从服务器获取一堆对象。我为Retrofit vs AsyncTask计时(使用我自己的JSON解析)。该性能非常接近,未达到该表的“一次讨论”列所示的3倍改进。当然,生成的代码更加简洁,我不必编写自己的JSON解析器,但是对于单个GET请求,并没有改善。 (2认同)

Sni*_*las 44

RoboSpice与 齐射

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

  • RoboSpice(RS)基于服务,比Volley更尊重Android哲学.Volley是基于线程的,这不是应该在Android上进行后台处理的方式.最终,你可以挖掘两个库并发现它们非常相似,但我们进行后台处理的方式更多是面向Android的,例如,它允许我们告诉用户RS实际上是在后台做某事,这将是凌空抽射(实际上根本没有).
  • RoboSpice和凌空都提供了很好的功能,如优先级排序,重试策略,请求取消.但是RS提供了更多:更高级的缓存,这是一个很大的缓存,具有缓存管理,请求聚合,更多功能,如重新填充待处理的请求,处理缓存到期而不依赖于服务器头,等等.
  • RoboSpice在UI Thread之外做了更多:凌空将在主线程上反序列化你的POJO,这在我看来很糟糕.使用RS,您的应用程序将更具响应性.
  • 就速度而言,我们肯定需要指标.RS现在已经超级快了,但我们仍然没有数据可以放在这里.排球理论上应该快一点,但RS现在大规模并行......谁知道呢?
  • RoboSpice提供扩展的大型兼容性范围.你可以使用它与okhttp,改造,ormlite(beta),杰克逊,jackson2,gson,xml序列化器,谷歌http客户端,spring android ...相当多.Volley可以与ok http一起使用并使用gson.而已.
  • Volley提供更多的用户界面糖RS.Volley提供了NetworkImageView,RS确实提供了一个spicelist适配器.就功能而言,它并不是到目前为止,但我相信Volley在这一主题上更为先进.
  • 自最初发布以来,RoboSpice已经解决了200多个错误.它非常强大,在生产中大量使用.Volley不太成熟,但其用户群应该快速增长(谷歌效应).
  • RoboSpice可在maven中心使用.排球很难找到;)

  • 为什么排球难以找到?`compile'c​​om.mcxiaoke.volley:library:1.0.+'` (7认同)

Ami*_*har 19

AFNetworking for Android:

快速的Android网络在这里

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

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

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

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

快速Android网络库支持为任何请求设置优先级(LOW,MEDIUM,HIGH,IMMEDIATE)

快速Android网络库支持RxJava

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

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

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

透明GZIP缩小了下载大小

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

谢谢:图书馆是我创建的


Ser*_*nko 18

异步HTTP客户端loopj与Volley

我的项目的细节是小的HTTP REST请求,每1-5分钟.

我很长时间使用异步HTTP客户端(1.4.1).性能优于使用vanilla Apache httpClient或HTTP URL连接.无论如何,新版本的库对我来说不起作用:库异常切换链回调.

阅读所有答案促使我尝试新的东西.我选择了Volley HTTP库.

使用它一段时间后,即使没有经过测试,我也清楚地看到响应时间降至1.5x,2x Volley.

也许Retrofit比异步HTTP客户端更好?我需要尝试一下.但我确信Volley不适合我.


Jef*_*eff 11

只是从我与Volley一起工作的经验中加入一些讨论:

  1. Volley在任何意义上都不处理流媒体上传或下载.也就是说,整个请求体必须在内存中,您不能使用an OutputStream将请求体写入底层套接字,也不能InputStream像基本HttpURLConnection那样使用an 来读取响应体.因此,Volley是上传或下载大文件的不良选择.您的请求和响应应该很小.这是我个人遇到的排球的最大限制之一.对于它的价值,OkHttp确实有用于处理流的接口.

  2. 缺乏官方文档很烦人,虽然我已经能够通过阅读源代码解决这个问题,这很容易理解.更令人讨厌的是,据我所知,Volley没有正式发布版本,也没有Maven或Gradle工件,因此将其作为依赖项管理比使用Square所发布的任何库更令人头疼. .你只需克隆一个仓库,建立一个罐子,你就可以自己动手了.寻找错误修复?取,希望它在那里.你也可能得到一些其他的东西; 它不会被记录在案.在我看来,这实际上意味着Volley是一个不受支持的第三方库,即使代码库相当活跃.买者自负.

  3. 作为一个尼特,将Content-Type绑定到类/请求类型(JsonObjectRequest,ImageRequest等)有点尴尬,并且稍微降低了调用代码的灵活性,因为您与Volley现有的Request类型层次结构相关联.我喜欢直接将Content-Type设置为像其他任何一样的标题(顺便说一下,不要对Volley这样做;你最终会得到两个Content-Type标题!).这只是我个人的意见,而且可以解决.

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


小智 9

我最近发现了一个名为ion的lib ,它为表增加了一些额外的功能.

ion内置支持与ImageView,JSON(在GSON的帮助下)集成的图像下载,文件和非常方便的UI线程支持.

我在一个新项目上使用它,到目前为止结果都很好.它的使用比Volley或Retrofit简单得多.

  • 离子vs改造,你会推荐哪一个? (2认同)