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

从iOS开发人员学习Android的两个部分的问题,工作在一个Android项目,将从JSON到图像到音频和video的流式下载的各种请求:

  1. 在iOS上,我广泛使用了AFNetworking项目。 有一个相当于Android的库吗?

  2. 我已经阅读了Square的OkHTTP和Retrofit ,以及Volley,但还没有与他们合作的经验。 我希望有人可以提供一些最佳用例的具体例子。 从我读到的,似乎OkHTTP是三个中最强大的,可以处理这个项目(上面提到)的要求。

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

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

Volley大概与Retrofit + Picasso竞争。 好的一面是一个图书馆。 在负面的方面,它是一个没有记录的,不被支持的,“把代码放在墙上,做一个I | O演示文档 ”库。

编辑 – Volley现在正式得到Google的支持。 请参阅Google开发人员指南

从我读过的,看起来好像OkHTTP是3中最强大的

如果可用,改装会自动使用OkHTTP。 杰克·沃顿(Jake Wharton)有一个把伏利(Volley)连接到奥克兰特区(OkHTTP)的要点。

并可以处理这个项目的要求(上面提到)。

大概你不会用“流媒体”的传统定义来“流式下载音频和video”。 相反,Android的媒体框架将为您处理这些HTTP请求。

话虽如此,如果您要尝试自己的基于HTTP的流,OkHTTP应该处理这种情况; 我不记得Volley将如何处理这种情况。 无论是改造还是毕加索都是为此而设计的。

在这里查看Volley透视图是您的需求的一些优点:

Volley一方面完全专注于处理单个的小型HTTP请求。 所以如果你的HTTP请求处理有一些怪癖,Volley可能有一个钩。 另一方面,如果你在image processing方面有一个怪癖,你唯一的真正的钩子是ImageCache 。 “这不是什么,但也不是很多!”。 但它有更多的其他优点,如一旦你定义你的请求,从一个片段或活动中使用它们是无痛的不像平行AsyncTasks

Volley的优点和缺点:

那么Volley有什么好处呢?

  • 网络部分不仅仅是图像。 排球意在成为你的后端不可分割的一部分。 对于基于简单的REST服务的新项目,这可能是一个巨大的胜利。

  • NetworkImageView比毕加索对请求清理更加积极,GC使用模式更保守。 NetworkImageView完全依赖于强大的内存引用,只要ImageView发出新请求,或者一旦ImageView移出屏幕,就立即清除所有请求数据。

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

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

  • 如果您要处理高分辨率的压缩图像,那么Volley是唯一可行的解​​决方案。

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

  • 排球在活动生命周期中扮演着不错的角色。

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

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

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

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

  3. 它的记录较少,但许多人支持在github中抽象化,像这样的java文档可以在这里find。 在android开发者网站上,你可以find使用Volley传输网络数据的指南。 在Google Git中可以find抽象的源代码

  4. 为了解决/改变Volley框架的重定向政策,使用Okley的Volley (上面提到的CommonsWare)

你也可以阅读比较Volley的图像加载与毕加索

改造:

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

改进的优点:

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

  • 我们可以使用它与任何序列化库,error handling。

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

  • 使用OkHttp 2.0进行Retrofit 1.6版本现在依赖于Okio来支持java.iojava.nio ,这使得使用ByteStringBuffer访问,存储和处理数据变得更加容易,可以做一些巧妙的事情来节省CPU和内存。 (仅供参考:这让我想起Koush的OIN库支持NIO)。我们可以使用RxJava的Retrofit来结合和链接使用rxObservables的 REST调用,以避免丑陋的回调链(避免回调地狱!!)

版本1.6的改进缺点:

  • 与内存相关的error handlingfunction并不好(在旧版本的Retrofit / OkHttp中)不确定使用带有Java NIO支持的Okio是否改进了内存。

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

(所有上述缺点已经在新版本的Retrofit 2.0 beta中解决了)

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

更新:

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

Android Async vs Volley vs Retrofit性能基准

(FYI以上改造基准信息将提高与Java NIO的支持,因为新版本的OKhttp依赖于NIO Okio库)

在三次不同重复次数(1 – 25次)的测试中,Volley的速度都在50%到75%之间。 以比AsyncTasks快50%到90%的速度,以相同的次数达到相同的端点。 在仪表板测试套件上,这转换成加载/解析数据几秒钟。 这是一个巨大的现实世界的差异。 为了使测试更公平,AsyncTasks / Volley的时间包括了JSON解析,因为Retrofit会自动完成。

RetroFit赢得基准测试!

最后,我们决定为了我们的应用而进行改造。 它不仅速度快得可怕,而且与我们现有的架构相得益彰。 我们能够创建一个父Callback接口,自动执行error handling,缓存和分页,而我们的API几乎毫不费力。 为了在Retrofit中合并,我们必须重命名我们的variables来使我们的模型符合GSON,编写几个简单的接口,从旧的API中删除函数,并修改我们的片段不使用AsyncTasks。 现在我们已经完全转换了一些碎片,这是非常痛苦的。 我们不得不克服一些成长中的痛苦和问题,但总的来说,进展顺利。 一开始,我们遇到了一些技术问题/错误,但Square有一个非常棒的Google+社区,能够帮助我们完成这个任务。

什么时候使用Volley?

当我们需要加载图像以及使用REST API时,我们可以使用Volley!同时需要多个不需要的网络调用排队系统! 也Volley有更好的记忆相关的error handling比改造!

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

来源,信用:Josh Ruesch先生的抽排与翻新

注意: 关于流媒体取决于你想要的流媒体types,如RTSP / RTCP。

RoboSpice VS. 齐射

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

  • RoboSpice(RS)是基于服务的,比Volley更尊重Android的哲学。 Volley是基于线程的,这不是在Android上进行后台处理的方式。 最终,你可以挖掘这两个库,发现它们是非常相似的,但是我们做后台处理的方式更多的是面向Android的,例如,它允许我们告诉用户RS实际上是在做背景的东西,这将是很难凌空(实际上根本没有)。
  • RoboSpice和排球都提供了很好的function,如优先级,重试策略,取消请求。 但RS提供了更多:更高级的缓存,这是一个很大的缓存管理,请求聚合,更多的function,如拒绝挂起的请求,处理缓存过期而不依赖于服务器头等。
  • RoboSpice在UI之外做更多的线程:volley将在主线程中反序列化你的POJO,这对我来说是非常可怕的。 与RS您的应用程序将更加敏感。
  • 就速度而言,我们绝对需要指标。 RS现在已经超快了,但是我们还是没有数字放在这里。 理论上来说,排球应该快一点,但是RS现在是大规模并行的……谁知道呢?
  • RoboSpice提供了一个扩展兼容性的范围。 你可以使用okhttp,retrofit,ormlite(beta),jackson,jackson2,gson,xml序列化程序,google http client,spring android …相当多。 排球可以用于确定http并使用gson。 而已。
  • 排球提供更多的UI糖,RS。 Volley提供了NetworkImageView,RS确实提供了一个spicelist适配器。 在function方面还不是很远,但我相信Volley在这个话题上更加先进。
  • 自从RoboSpice发布以来,已经有超过200个bug被解决了。 它非常强大,在生产中大量使用。 排雷不太成熟,但其用户群应该快速增长(谷歌效应)。
  • RoboSpice在Maven中心上可用。 排球很难find;)

异步HTTP客户端loopj与Volley

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

我使用异步HTTP客户端(1.4.1)很长一段时间。 性能比使用香草Apache httpClient或HTTP URL连接要好。 无论如何,这个库的新版本不适合我:库间例外的回调链。

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

使用一段时间后,即使没有进行测试,我也清楚地看到响应时间缩短到1.5倍,2次排气。

也许Retrofit比异步HTTP客户端更好? 我需要尝试一下。 但我相信沃利不适合我。

适用于Android的AFNetworking:

快速的Android网络在这里

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

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

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

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

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

快速的Android网络库支持RxJava

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

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

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

透明的GZIP缩小下载大小

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

谢谢:图书馆是由我创建的

只是为了加入我在与Volley合作的经验中的讨论:

  1. Volley不处理任何意义上的流式上传或下载。 也就是说,整个请求体必须在内存中,并且不能使用OutputStream将请求体写入底层套接字,也不能像基本的HttpURLConnection那样使用InputStream读取响应体。 所以,对于上传或下载大文件,Volley是一个糟糕的选择。 你的要求和回应应该很小。 这是我亲自遇到的Volley最大的限制之一。 对于它的价值,OkHttp确实有接口来处理流。

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

  3. 作为一个尼特,将Content-Type绑定到类/请求types(JsonObjectRequest,ImageRequest等)是有点笨拙的,并且会降低调用代码的灵活性,因为您连接到Volley的现有的Requesttypes层次结构。 我喜欢将Content-Type设置为任何其他标题的简单性(顺便说一句,不要用Volley来做这个;你最终会得到两个Content-Type头文件)。 但这只是我个人的看法,可以解决。

这并不是说Volley没有一些有用的function。 当然可以。 轻松自定义的重试策略,透明缓存,取消API以及对请求调度和并发连接的支持都是很好的function。 只要知道它不适用于所有的HTTP使用情况(请参阅上面的第1项),并且在您的应用程序中使用Volley进行生产使用(第2项)时会遇到一些麻烦。

我最近发现了一个名为ion的lib,它为表格带来了一些额外的function。

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

我正在使用它在一个新的项目,迄今为止的结果是好的。 它的使用比Volley或Retrofit简单得多。

添加到接受的答案和什么LOG_TAG说….为排气解析您的数据在后台线程中,您必须子类Request作为onResponse方法在主线程上调用,并在主线程上解析可能会导致UI如果你的反应很大,就会滞后。 在这里阅读如何做到这一点。

1.9.0与RoboSpice的改造

我正在使用我的应用程序。

当我解析嵌套的JSON类时,Robospice比Retrofit工作的更快。 因为香料经理会为你做所有的事情。 在Retrofit中,您需要创建GsonConverter并将其反序列化。

我在同一个活动中创建了两个片段,并使用两个相同types的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 

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

  • 它是像Volley这样的模块化的,但更多的扩展和文档正在改进,支持不同的HTTP堆栈和转换器
  • 它有一个模块来生成服务器API接口映射,如Retrofit
  • 它也有JavaRx支持

还有许多其他便利的function,如标记,变压器等