一方面,Volley完全专注于处理个人的小型HTTP请求 . 因此,如果您的HTTP请求处理有一些怪癖,Volley可能会为您提供一个钩子 . 另一方面,如果你的图像处理有一个怪癖,你唯一真正的钩子是 ImageCache . "It’s not nothing, but it’s not a lot!, either" . 但它还有更多其他优点,例如一旦定义了请求,在片段或活动中使用它们就像并行AsyncTasks一样无痛
版本1.6现在依赖于 Okio 来支持java.io和java.nio,这使得使用ByteString和Buffer访问,存储和处理数据更加容易,可以做一些聪明的事情来节省CPU和内存 . (仅供参考:这让我想起了支持NIO的Koush's OIN库!)我们可以使用Retrofit together with RxJava来组合并使用rxObservables链接REST调用以避免丑陋的回调链(以避免回调地狱!) .
10 回答
如果要与Web服务通信,请使用Retrofit . 如果要下载图像,请使用对等库Picasso . 如果您需要在Retrofit / Picasso之外进行HTTP操作,请使用OkHTTP .
Volley大致与Retrofit Picasso竞争 . 从好的方面来说,它是一个图书馆 . 在负面,它是一个未记录的,一个不受支持的"throw the code over the wall and do an I|O presentation on it"库 .
编辑 - 排球现在由谷歌正式支持 . 请参考Google Developer Guide
如果可用,Retrofit会自动使用OkHTTP . 有一个Gist from Jake Wharton将Volley连接到OkHTTP .
通过传统的“流媒体”定义,你可能不会将它们用于“音频和视频的流媒体下载” . 相反,Android的媒体框架将为您处理这些HTTP请求 .
话虽如此,如果您打算尝试自己的基于HTTP的流式传输,OkHTTP应该处理这种情况;我不记得Volley如何处理这种情况 . Retrofit和Picasso都不是为此设计的 .
只是从我与Volley一起工作的经验中加入一些讨论:
Volley在任何意义上都不处理流式上传或下载 . 也就是说,整个请求体必须在内存中,你不能使用
OutputStream
将请求体写入底层套接字,也不能使用InputStream
来读取响应体,就像基本的HttpURLConnection
一样 . 因此,Volley是上传或下载大文件的不良选择 . 您的请求和响应应该很小 . 这是我个人遇到的Volley的最大限制之一 . 对于它的 Value ,OkHttp确实有用于处理流的接口 .缺乏官方文档很烦人,虽然我已经能够通过阅读源代码来解决这个问题,这很容易理解 . 更令人讨厌的是,据我所知,Volley没有官方发行版本,也没有Maven或Gradle工件,因此将它作为依赖项管理比使用Square所发布的任何库更令人头疼 . . 你只需克隆一个仓库, Build 一个 jar ,你就可以自己动手了 . 寻找错误修复?取,希望它在那里 . 你也可能得到一些其他的东西;它不会被记录在案 . 在我看来,这实际上意味着Volley是一个不受支持的第三方库,即使代码库相当活跃 . 买者自负 .
作为一个尼特,将Content-Type绑定到类/请求类型(JsonObjectRequest,ImageRequest等)有点尴尬,并且稍微降低了调用代码的灵活性,因为您与Volley现有的Request类型层次结构相关联 . 我喜欢直接将Content-Type设置为像其他任何一样的 Headers (顺便说一下,不要对Volley这样做;你最终会得到两个Content-Type Headers !) . 不过,这只是我个人的意见,而且可以解决 .
这并不是说Volley没有一些有用的功能 . 当然可以 . 易于定制的重试策略,透明缓存,取消API以及对请求调度和并发连接的支持是很棒的功能 . 只要知道它并非适用于所有HTTP用例(参见上面的第1项),并且在您的应用程序中将Volley投入 生产环境 使用会引起一些麻烦(第2项) .
AFNetworking for Android:
Fast Android Networking是here
快速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网络库支持响应缓存,可以完全避免网络重复请求
谢谢:图书馆是我创建的
从这里看Volley的观点可以满足您的要求:
一方面,Volley完全专注于处理个人的小型HTTP请求 . 因此,如果您的HTTP请求处理有一些怪癖,Volley可能会为您提供一个钩子 . 另一方面,如果你的图像处理有一个怪癖,你唯一真正的钩子是 ImageCache . "It’s not nothing, but it’s not a lot!, either" . 但它还有更多其他优点,例如一旦定义了请求,在片段或活动中使用它们就像并行AsyncTasks一样无痛
Pros and cons of Volley:
那么Volley有什么好看的?
网络部分不仅适用于图像 . Volley旨在成为您后端不可或缺的一部分 . 对于基于简单REST服务的新项目,这可能是一个巨大的胜利 .
NetworkImageView对于请求清理比Picasso更积极,并且在其GC使用模式中更加保守 . NetworkImageView完全依赖于强内存引用,并在为ImageView发出新请求时立即清除所有请求数据,或者在ImageView移出屏幕后立即清除 .
表现 . 这篇文章不会评估这一说法,但他们显然需要谨慎对待他们的内存使用模式 . Volley还努力批量回调主线程以减少上下文切换 .
Volley显然也有未来 . 如果您有兴趣,请查看RequestFuture .
如果您正在处理高分辨率的压缩图像,那么Volley是唯一能够很好地运行的解决方案 .
Volley可与Okhttp一起使用(新版Okhttp支持NIO以获得更好的性能)
Volley在Activity生命周期中表现出色 .
排球问题:
由于Volley是新的,很少有东西不支持,但它是固定的 .
多部分请求(解决方案:https://github.com/vinaysshenoy/enhanced-volley)
状态代码201被视为错误,状态代码从200到207现在是成功的响应 . (已修复:https://github.com/Vinayrraj/CustomVolley)
Update: 在Google排球的最新版本中,2XX状态代码错误现在是 fixed !感谢Ficus Kirkpatrick!
它的记录较少,但很多人都在github上支持齐射,像文档这样的java可以找到here . 在Android开发人员网站上,您可以找到Transmitting Network Data Using Volley的指南 . 并且可以在Google Git找到凌空源代码
解决/更改Redirect Policy of Volley框架使用Volley with OkHTTP(上面提到的CommonsWare)
你也可以读这个Comparing Volley's image loading with Picasso
Retrofit:
它由Square发布,这提供了非常容易使用的REST API(更新:Voila!支持NIO)
Pros of Retrofit:
与Volley相比,Retrofit的REST API代码简洁,提供了出色的API文档,并在社区中得到了很好的支持!添加到项目中非常容易 .
我们可以将它与任何序列化库一起使用,并进行错误处理 .
Update: - Retrofit 2.0.0-beta2有很多非常好的变化
带有OkHttp 2.0的改造的
Cons of Retrofit for version 1.6:
内存相关的错误处理功能不好(在旧版本的Retrofit / OkHttp中)不确定它是否通过支持Java NIO的Okio得到了改进 .
如果我们以不正当的方式使用它,最小的线程辅助可能会导致回调地狱 .
(所有上述缺点已在新版本的Retrofit 2.0 beta中得到解决)
================================================== ======================
Update:
Android Async vs Volley vs Retrofit performance benchmarks (milliseconds, lower value is better):
(由于新版本的OKhttp依赖于NIO Okio库,因此可以通过Java NIO支持改进上面的Retrofit Benchmarks信息)
什么时候使用Volley?!
当我们需要加载图像以及使用REST API时,我们可以使用Volley!同时需要许多n / w请求的网络呼叫排队系统! also Volley has better memory related error handling than Retrofit!
OkHttp 可与Volley一起使用,Retrofit默认使用 OkHttp !它具有SPDY支持,连接池,磁盘缓存,透明压缩!最近,它得到了一些支持java NIO和Okio库的支持 .
来源,信用:Josh Ruesch先生的volley-vs-retrofit
注意:关于流式传输取决于您想要的流式传输类型,如RTSP / RTCP .
Retrofit 1.9.0 vs. RoboSpice
我在我的应用程序中使用这两个 .
每当我解析嵌套的JSON类时,Robospice的工作速度都比Retrofit快 . 因为Spice Manger会为你做一切 . 在Retrofit中,您需要创建GsonConverter并对其进行反序列化 .
我在同一个活动中创建了两个片段,并使用两种相同类型的URL同时调用 .
我最近发现了一个名为ion的lib,它给表带来了额外的一点 .
ion内置支持与ImageView集成的图像下载,JSON(在GSON的帮助下),文件和非常方便的UI线程支持 .
我在一个新项目上使用它,到目前为止结果都很好 . 它的使用比Volley或Retrofit简单得多 .
而另一种选择:https://github.com/apptik/jus
它像Volley一样模块化,但更多扩展和文档正在改进,支持不同的HTTP堆栈和开箱即用的转换器
它有一个模块来生成服务器API接口映射,如Retrofit
它还具有JavaRx支持
还有许多其他方便的功能,如标记,变压器等 .
Async HTTP client loopj vs. Volley
我的项目的细节是每小时1-5分钟的小型HTTP REST请求 .
我使用异步HTTP客户端(1.4.1)很长一段时间 . 性能优于使用vanilla Apache httpClient或HTTP URL连接 . 无论如何,新版本的库对我来说不起作用:库异常切换回调链 .
阅读所有答案促使我尝试新的东西 . 我选择了Volley HTTP库 .
使用它一段时间后,即使没有测试,我也清楚地看到响应时间降至1.5倍,2倍排球 .
也许Retrofit比异步HTTP客户端更好?我需要尝试一下 . 但我确信Volley不适合我 .
RoboSpice Vs. Volley
从https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ
RoboSpice(RS)基于服务,比Volley更尊重Android哲学 . Volley是基于线程的,这不是应该在Android上进行后台处理的方式 . 最终,你可以挖掘两个库并发现它们非常相似,但我们进行后台处理的方式更多是面向Android的,例如,它允许我们告诉用户RS实际上是在后台做某事,这将是排球很难(实际上根本没有) .
RoboSpice和凌空都提供了很好的功能,如优先级排序,重试策略,请求取消 . 但是RS提供了更多:更高级的缓存,这是一个很大的缓存,具有缓存管理,请求聚合,更多功能,如重新填充待处理请求,处理缓存到期而不依赖于服务器头,等等 .
RoboSpice在UI线程之外做了更多:凌空将在主线程上反序列化你的POJO,这在我看来很可怕 . 使用RS,您的应用程序将更具响应性 .
就速度而言,我们绝对需要指标 . RS现在已经超级快了,但我们仍然没有数据可以放在这里 . 排球理论上应该更快一些,但RS现在大规模并行......谁知道?
RoboSpice提供扩展的大型兼容性范围 . 你可以使用它与okhttp,改造,ormlite(beta), Jackson ,jackson2,gson,xml序列化器,谷歌http客户端,spring android ...相当多 . Volley可以与ok http一起使用并使用gson . 而已 .
Volley提供更多的用户界面糖RS . Volley提供NetworkImageView,RS确实提供了一个spicelist适配器 . 就功能而言,它并不是到目前为止,但我相信Volley在这一主题上更为先进 .
RoboSpice自首次发布以来已经解决了200多个错误 . 它非常强大,在 生产环境 中大量使用 . Volley不太成熟,但其用户群应该快速增长(谷歌效应) .
RoboSpice可在maven中心使用 . 排球很难找到;)
添加到接受的答案和什么LOG_TAG说....为了让Volley在后台线程中解析你的数据你必须继承
Request<YourClassName>
,因为在主线程上调用了onResponse
方法,如果你的响应很大,主线程上的解析可能会导致UI滞后 . 阅读here了解如何做到这一点 .