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

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

  • 在iOS上,我广泛使用了AFNetworking项目。 有没有一个等效的Android库?

  • 我已经阅读了Square上的OkHTTP和Retrofit以及Volley,但还没有与他们一起开发经验。 我希望有人能提供一些最佳用例的具体例子。 从我读过的内容看,似乎OkHTTP是三者中最强大的,并且可以处理这个项目的需求(如上所述)。


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

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

    Volley大致与Retrofit + Picasso竞争。 另一方面,它是一个图书馆。 在负面方面,它是一个没有记录的,不受支持的,“将代码放在墙上并对其执行I | O演示”库。

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

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

    如果可用,Retrofit会自动使用OkHTTP。 Jake Wharton有一个将Volley和OkHTTP连接起来的Gist。

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

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

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


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

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

    Volley的优缺点:

    那么Volley有什么好处?

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

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

  • 性能。 这篇文章不会评估这个说法,但是他们已经明确地在内存使用模式中谨慎一些。 Volley还努力为主线程批量回调以减少上下文切换。

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

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

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

  • 排球在活动生命周期中表现出色。

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

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

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

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

  • 它没有文档记载,但许多人都支持在github中抽象化,java可以在这里找到文档。 在android开发人员网站上,您可能会找到使用Volley传输网络数据的指南。 在Google Git上可以找到大量的源代码

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

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

    改造:

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

    改进的优点:

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

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

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

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

  • 与内存相关的错误处理功能并不好(在旧版本的Retrofit / OkHttp中)并不确定是否使用具有Java NIO支持的Okio进行了改进。

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

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

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

    更新:

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

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

    (FYI高于Retrofit基准测试信息会随着java NIO的支持而提高,因为OKhttp的新版本依赖于NIO Okio库)

    在三次不同重复次数(1 - 25次)的测试中,Volley的速度都在50%到75%之间。 以比AsyncTasks快50%至90%的速度提供改进,以相同的次数达到相同的端点。 在仪表板测试套件中,这转换为加载/解析数据几秒钟。 这是一个巨大的现实世界的差异。 为了使测试更公平,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库的支持。

    来源,信用:Josh Ruesch先生的抽气与改造

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


    RoboSpice VS. 齐射

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

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

    上一篇: Comparison of Android networking libraries: OkHTTP, Retrofit, and Volley

    下一篇: android.os.NetworkOnMainThreadException with android 4.2