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

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

  1. 在iOS上,我广泛使用AFNetworking项目。Android上有类似的库吗?

  2. 我读过Square的OkHTTP改造,以及凌空抽射,但还没有使用它们开发的经验。我希望有人能够为每种方法提供一些最佳用例的具体示例。从我所读到的,OkHTTP似乎是三个中最健壮的,并且可以处理这个项目的需求(上面提到过)。

259136 次浏览

我希望有人能够为每种方法提供一些最佳用例的具体示例。

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

Volley与Retrofit + Picasso大致竞争。好的方面是,它是一个库。在不利的一面,它是一个无证,一个不受支持的库,“把代码扔到墙上,在上面做一个I|O演示”。

编辑-排射现在正式支持谷歌。请参考谷歌开发者指南

据我所知,OkHTTP似乎是这三个中最健壮的

如果可以,Retrofit会自动使用OkHTTP。有一个杰克·沃顿的主旨连接Volley到OkHTTP。

并能处理这个项目的要求(如上所述)。

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

也就是说,如果您打算尝试自己的基于http的流,OkHTTP应该处理这种情况;我不记得Volley会如何处理这种情况。无论是Retrofit还是Picasso都不是为此而设计的。

看看Volley透视图,这里有一些适合您需求的优点:

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

Volley的优点和缺点:

那么Volley的优点是什么呢?

    网络部分不仅仅是为了图像。凌空抽射的目的是 是你屁股不可分割的一部分。对于一个基于 简单的REST服务,这可能是一个巨大的胜利 NetworkImageView在请求清理方面比 毕加索,并且在GC使用模式上更加保守。 NetworkImageView只依赖于强内存引用 类的新请求时,立即清理所有请求数据 ImageView,或者当ImageView移出屏幕时 <李> < p >性能。这篇文章不会评价这种说法,但他们显然已经 小心谨慎地使用他们的记忆模式。 Volley还努力批量回调主线程到

    Volley显然也有未来。如果你是 感兴趣。< / p > 如果您正在处理高分辨率压缩图像,Volley是 这里唯一有效的解决方案。

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

  • Volley在Activity生命周期中发挥得很好。

截击问题:
由于Volley是新的,一些东西还不支持,但它是固定的

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

  2. 状态码201被视为错误,状态码从200到207现在是成功响应。(固定:# EYZ0)

    更新:在最新发布的谷歌凌空,2XX状态代码错误是固定现在!感谢Ficus Kirkpatrick!

  3. 它的文档较少,但许多人在github中支持volley,可以在在这里中找到类似java的文档。 在android开发者网站上,你可以找到使用Volley传输网络数据的指南。和凌空源代码可以在谷歌Git

    找到
  4. 要解决/更改齐射重定向策略框架,请使用用OkHTTP截击(上面提到的CommonsWare)

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

改造:

它由广场发布,它提供了非常容易使用的REST API(更新:瞧!蔚来汽车支持)

改造的优点:

    与Volley相比,Retrofit的REST API代码很简单,并提供了 优秀的API文档,在社区中有很好的支持! 它很容易添加到项目中。

  • 我们可以在任何序列化库中使用它,带有错误处理。

更新:

  • 在Retrofit 2.0.0-beta2中有很多非常好的变化

  • 版本1.6的OkHttp 2.0现在依赖于Okio来支持ionio,这使得它更容易访问,存储和处理您的数据使用ByteString缓冲做一些聪明的事情来节省CPU和内存。(供参考:这让我想起了NIO支持的Koush的开源发明网络库!) 我们可以使用与RxJava一起改造来组合和连接REST调用,使用rxObservables来避免丑陋的回调链(为了避免回调地狱!!)

版本1.6的缺点:

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

  • 如果我们使用这个函数,最小的线程辅助可以导致回调hell

    .以不恰当的方式

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

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

更新:

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

< span style=" font - family:宋体;"> < / th >一个讨论 < span style=" font - family:宋体;">仪表盘(7个请求) < span style=" font - family:宋体;"> < / th > 25讨论 < span style=" font - family:宋体;"> 941 ms td > < / < span style=" font - family:宋体;"> 4539 ms td > < / < span style=" font - family:宋体;"> 13957 ms td > < / < span style=" font - family:宋体;"> 560 ms td > < / < span style=" font - family:宋体;"> 2202 ms td > < / < span style=" font - family:宋体;"> 4275 ms td > < / < span style=" font - family:宋体;"> 312 ms td > < / < span style=" font - family:宋体;"> 889 ms td > < / < span style=" font - family:宋体;"> 1059 ms td > < /
图书馆
AsyncTask
凌空抽射
改造

(供参考,上面的改装基准信息将改善java NIO支持,因为新版本的OKhttp依赖于NIO Okio库)

在所有三个不同重复次数(1 - 25次)的测试中,Volley是 速度从50%到75%不等。翻新的结果令人印象深刻 比AsyncTasks快50%到90%,到达相同的端点 同样的次数。在仪表板测试套件上,这转换了 使加载/解析数据的速度加快几秒钟。这是一个 现实世界的巨大差异。为了使考试公平 AsyncTasks/Volley的times像Retrofit一样包含JSON解析

RetroFit在基准测试中获胜!

最后,我们决定在我们的应用程序中使用Retrofit。不 只是它的速度快得离谱,但它与我们的 现有的架构。我们能够做一个父回调 接口,自动执行错误处理、缓存和 对我们的api来说,分页几乎没有任何努力。为了合并 改造,我们不得不重命名我们的变量,使我们的模型GSON 兼容的,写几个简单的接口,删除功能从 旧的API,并修改我们的片段不使用AsyncTasks。既然我们 有一些片段完全转换,这是相当轻松的。在那里 我们必须克服一些成长的烦恼和问题,但是 总的来说,一切都很顺利。一开始,我们遇到了一些 但是Square有一个很棒的谷歌+社区

什么时候使用凌空?!

当我们需要加载图像以及使用REST api时,我们可以使用Volley !,网络呼叫排队系统需要同时处理多个n/w请求!# EYZ0

OkHttp可以使用凌空,改装使用OkHttp默认!它有SPDY支持,连接池,磁盘缓存,透明压缩!最近,它通过Okio库获得了java NIO的一些支持。

来源:Josh Ruesch先生的< >强volley-vs-retrofit < / >强

注:# EYZ0

# EYZ0

从# EYZ0

  • RoboSpice(RS)是基于服务的,比Volley更尊重Android理念。Volley是基于线程的,这不是Android上后台处理的方式。最终,你可以挖掘这两个库,发现它们非常相似,但我们做后台处理的方式更面向Android,例如,它允许我们告诉用户RS实际上在后台做一些事情,这对于volley来说很难(实际上它根本没有)。
  • RoboSpice和volley都提供了很好的功能,比如优先级、重试策略、请求取消。但是RS提供了更多:一个更高级的缓存,这是一个很大的缓存,具有缓存管理、请求聚合、更多的特性,如重新插入一个挂起的请求、在不依赖服务器头的情况下处理缓存过期等。
  • RoboSpice在UI线程之外做了更多的事情:volley会在主线程上反序列化你的pojo,这对我来说很可怕。有了RS,你的应用程序的响应速度会更快。
  • 就速度而言,我们当然需要指标。RS现在已经变得非常快了,但我们仍然没有数据放在这里。抽射理论上应该快一点,但是RS现在大量并行…谁知道呢?
  • RoboSpice通过扩展提供了很大的兼容性范围。你可以使用okhttp, retrofit, ormite (beta), jackson, jackson2, gson, xml序列化器,谷歌http客户端,spring android…相当多。Volley可以使用ok http和使用gson。就是这样。
  • Volley提供了比RS更多的UI糖。Volley提供了NetworkImageView, RS也提供了spiceist适配器。就功能而言,它还不是很远,但我相信Volley在这个主题上更先进。
  • 自首次发布以来,RoboSpice已经解决了200多个错误。它非常健壮,在生产中大量使用。Volley还不太成熟,但它的用户基础应该会快速增长(谷歌效应)。
  • RoboSpice可以在maven central上使用。抽射很难找到;)

异步HTTP客户端loopj vs. Volley

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

我使用异步HTTP客户端(1.4.1)很长一段时间。性能优于使用普通的Apache httpClient或HTTP URL连接。无论如何,新版本的库不适合我:库内部异常切断回调链。

阅读所有的答案激励我尝试一些新的东西。我选择了Volley HTTP库。

使用一段时间后,即使没有测试,我清楚地看到,响应时间下降到1.5倍,2倍的排射。

也许Retrofit比异步HTTP客户端更好?我得试试。 但我敢肯定Volley不适合我

从我与Volley合作的经验来看,我想补充一点:

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

  2. 官方文档的缺乏令人恼火,尽管我已经能够通过阅读源代码来解决这个问题,这非常容易理解。更麻烦的是,据我所知,Volley没有正式的发布版本,也没有Maven或Gradle工件,因此将它作为依赖项管理比Square发布的任何库都更令人头疼。你只需要克隆一个回购,做一个罐子,你就靠自己了。寻找bug修复?去拿吧,希望它还在。你可能还会得到一些其他的东西;它不会被记录下来。在我看来,这实际上意味着Volley是一个不受支持的第三方库,即使代码库相当活跃。购者自慎。

  3. 总之,将Content-Type绑定到类/请求类型(JsonObjectRequest, ImageRequest等)有点尴尬,并降低了调用代码的灵活性,因为您被绑定到Volley现有的请求类型层次结构中。我喜欢将Content-Type设置为标题的直接性(顺便说一下,不要对Volley这样做;你会得到两个内容类型的头!)不过,这只是我个人的观点,它是可以解决的。

这并不是说Volley没有一些有用的功能。的确如此。易于定制的重试策略、透明缓存、取消API以及对请求调度和并发连接的支持都是很棒的特性。但是要知道它并不适用于所有的HTTP用例(参见上面的第1项),而且在应用程序中将Volley投入生产使用(第2项)会有一些令人头疼的问题。

添加到接受的答案和LOG_TAG说....对于Volley在后台线程中解析你的数据,你必须子类化Request<YourClassName>,因为onResponse方法是在主线程上调用的,如果你的响应很大,在主线程上解析可能会导致UI延迟。

我最近发现了一个名为离子的库,它为表带来了一些额外的功能。

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

我在一个新项目上使用了它,到目前为止效果还不错。它的使用比Volley或Retrofit简单得多。

Retrofit 1.9.0 vs 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
还有另一个选择: # EYZ0 < / p >
  • 它像Volley一样是模块化的,但更多的扩展和文档正在改进,支持不同的HTTP堆栈和开箱即用的转换器
  • 它有一个模块来生成服务器API接口映射,比如Retrofit
  • 它还支持JavaRx

以及许多其他方便的功能,如标记,变形金刚等。

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网络库支持响应缓存,完全避免网络重复请求

谢谢:图书馆是我创建的