591

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

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

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

4

10 回答 10

658

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

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

Volley 与 Retrofit + Picasso 大致竞争。从好的方面来说,它是一个图书馆。不利的一面是,它是一个未记录的、不受支持的“将代码扔到墙上并在其上进行 I|O 演示”的库。

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

从我读过的内容来看,OkHTTP 似乎是 3 个中最健壮的

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

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

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

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

于 2013-06-03T18:18:03.980 回答
363

从 Volley 的角度来看,这里有一些满足您要求的优势:

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

Volley的优点和缺点:

那么 Volley 有什么好处呢?

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

  • NetworkImageView 在请求清理方面比 Picasso 更激进,在 GC 使用模式上也更保守。NetworkImageView 完全依赖于强内存引用,一旦对 ImageView 发出新请求,或者一旦 ImageView 移出屏幕,就会清理所有请求数据。

  • 表现。这篇文章不会评估这种说法,但他们显然已经在他们的内存使用模式上采取了一些谨慎的态度。Volley 还努力批量回调主线程以减少上下文切换。

  • 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 volley 中,2XX 状态码错误现已修复!感谢 Ficus Kirkpatrick!

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

  4. 要解决/更改Volley框架 的重定向策略,请使用带有 OkHTTP 的 Volley(上面提到的 CommonsWare)

你也可以阅读这篇Comparing Volley's image loading with Picasso

改造:

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

改造的优点:

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

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

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

  • 带有 OkHttp 2.0 的 Retrofit 1.6 版现在依赖于 Okio支持java.iojava.nio ,这使得使用ByteStringBuffer访问、存储和处理数据变得更加容易,从而节省 CPU 和内存。(仅供参考:这让我想起了支持 NIO 的Koush 的 OIN库!) 我们可以将Retrofit 与 RxJava 一起使用,使用 rxObservables组合和链接 REST 调用,以避免丑陋的回调链(避免回调地狱!!)

1.6 版改造的缺点:

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

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

(以上所有Cons都已在新版Retrofit 2.0 beta中解决)

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

更新:

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

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

(仅供参考,Retrofit Benchmarks 信息将通过 java NIO 支持得到改进,因为新版本的 OKhttp 依赖于 NIO Okio 库)

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

RetroFit 在基准测试中获胜!

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

什么时候使用排球?!

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

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

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

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

于 2013-09-18T03:33:16.067 回答
44

RoboSpice VS。排球

来自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。而已。
  • Volley 提供了比 RS 更多的 UI 糖分。Volley 提供 NetworkImageView,RS 确实提供了一个 spicelist 适配器。就功能而言,目前还没有,但我相信 Volley 在这个主题上更先进。
  • 自首次发布以来,RoboSpice 已解决了 200 多个错误。它非常健壮,并在生产中大量使用。Volley 不太成熟,但它的用户群应该会快速增长(谷歌效应)。
  • RoboSpice 在 maven Central 上可用。排球很难找到;)
于 2014-01-10T18:16:13.103 回答
20

适用于 Android 的 AFNetworking:

快速安卓网络在这里

Fast Android Networking Library 支持所有类型的 HTTP/HTTPS 请求,例如 GET、POST、DELETE、HEAD、PUT、PATCH

Fast Android Networking Library 支持下载任何类型的文件

Fast Android Networking Library 支持上传任何类型的文件(支持分段上传)

Fast Android Networking Library 支持取消请求

Fast Android Networking Library 支持为任何请求设置优先级(LOW、MEDIUM、HIGH、IMMEDIATE)

Fast Android Networking Library 支持 RxJava

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

Fast Android Networking Library 支持 HTTP/2 支持允许对同一主机的所有请求共享一个套接字

Fast Android Networking Library 使用连接池来减少请求延迟(如果 HTTP/2 不可用)

透明 GZIP 缩小下载大小

Fast Android Networking Library 支持响应缓存,完全避免网络重复请求

谢谢:图书馆是我创建的

于 2016-07-16T15:39:55.777 回答
18

异步 HTTP 客户端 loopj 与 Volley

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

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

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

使用一段时间后,即使没有测试,我也清楚地看到响应时间下降到 1.5x,2x Volley。

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

于 2014-06-06T08:07:25.207 回答
11

只是从我与 Volley 合作的经验中添加一点讨论:

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

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

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

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

于 2014-08-28T19:10:32.813 回答
9

我最近发现了一个名为ion的库,它为桌面带来了一些额外的东西。

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

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

于 2015-03-29T03:28:54.970 回答
4

添加到已接受的答案和 LOG_TAG 所说的内容......为了让 Volley 在后台线程中解析您的数据,您必须子类Request<YourClassName>化,因为在主线程上调用该onResponse方法并且在主线程上解析可能会导致 UI 滞后如果您的响应很大。在这里阅读如何做到这一点。

于 2015-03-16T07:33:02.743 回答
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
于 2015-09-23T14:46:40.603 回答
2

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

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

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

于 2016-03-21T16:14:58.410 回答