来自iOS开发人员学习Android的两部分问题,处理一个Android项目,该项目将发出从JSON到图像到音频和视频的流媒体下载的各种请求:
在iOS上,我广泛使用了AFNetworking项目。是否有适用于Android的等效库?
我已经阅读过Square OkHTTP和Retrofit以及Volley,但还没有使用它们的经验。我希望有人可以提供一些最佳使用案例的具体例子。从我所看到的,看起来OkHTTP是三者中最强大的,并且可以处理这个项目的要求(如上所述)。
答案 0 :(得分:627)
我希望有人可以为每个用例提供最佳用例的具体示例。
如果您正在与Web服务通信,请使用Retrofit。如果要下载图像,请使用对等库Picasso。如果您需要在Retrofit / Picasso之外进行HTTP操作,请使用OkHTTP。
Volley与Retrofit + Picasso大致竞争。从好的方面来说,它是一个图书馆。在负面,它是一个未记录的,一个不受支持的,“将代码抛到墙上并对其进行I | O演示”库。
编辑 - 排球现在由谷歌正式支持。请参考Google Developer Guide
从我读过的内容来看,OkHTTP似乎是最强大的3
如果可用,Retrofit会自动使用OkHTTP。有一个Gist from Jake Wharton将Volley连接到OkHTTP。
并且可以处理该项目的要求(如上所述)。
通过传统的“流媒体”定义,你可能不会将它们用于“音频和视频的流媒体下载”。相反,Android的媒体框架将为您处理这些HTTP请求。
话虽如此,如果您打算尝试自己的基于HTTP的流式传输,OkHTTP应该处理这种情况;我不记得Volley如何处理这种情况。 Retrofit和Picasso都不是为此设计的。
答案 1 :(得分:349)
从这里看Volley的观点可以满足您的要求:
一方面,Volley完全专注于处理个人的小型HTTP请求。因此,如果您的HTTP请求处理有一些怪癖,Volley可能会为您提供一个钩子。另一方面,如果你的图像处理有一个怪癖,你唯一真正的钩子是 ImageCache 。 "这不是什么,但它不是很多!,或者#34;。但它还有更多其他优点,例如一旦定义了请求,在片段或活动中使用它们就像在并行AsyncTasks中一样无痛排球的利弊:
那么Volley有什么好看的?
网络部分不仅适用于图像。 Volley打算成为 你的后端不可或缺的一部分。对于基于a的新项目 简单的REST服务,这可能是一个巨大的胜利。
NetworkImageView对请求清理的攻击性要高于 毕加索,其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)
更新:在最新版本的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
<强>改造:强>
由Square发布,这提供了非常易于使用的REST API(更新:Voila!支持NIO)
改造优点:
与Volley相比,Retrofit的REST API代码简洁而且提供 优秀的API文档,并在社区中提供良好的支持! 添加到项目中非常容易。
我们可以将它与任何序列化库一起使用,并进行错误处理。
<强>更新强> - Retrofit 2.0.0-beta2中有很多非常好的变化
版本1.6的改造缺点:
内存相关的错误处理功能并不好(在旧版本的Retrofit / OkHttp中)不确定它是否通过支持Java NIO的Okio得到了改进。
如果我们使用它,最小线程协助可能会导致回调地狱 以不正当的方式。
(以上所有缺点已在新版本的Retrofit 2.0 beta中解决)
=============================================== =========================
<强>更新强>
Android Async vs Volley vs Retrofit性能基准测试(毫秒,更低值更好):
(因为新版本的OKhttp依赖于NIO Okio库,因此改进基准测试信息将在Java NIO支持下得到改善)
在所有三次重复不同的测试中(1 - 25次),Volley是 任何地方都快50%到75%。改造令人印象深刻 比AsyncTasks快50%到90%,击中相同的端点 相同的次数。在仪表板测试套件中,这个翻译 加载/解析数据快几秒钟。这是一个 巨大的现实世界差异。为了使测试公平, AsyncTasks / Volley的时间包括JSON解析为Retrofit 它会自动为你服务。
RetroFit在基准测试中胜出!
最后,我们决定使用Retrofit进行申请。不 只是它的速度非常快,但它与我们相处得非常好 现有的架构。我们能够制作一个父回调 自动执行错误处理,缓存和的接口 我们的API很少甚至没有努力的分页。为了合并 改造,我们不得不重命名我们的变量来制作我们的模型GSON 兼容,写几个简单的接口,从中删除功能 旧的API,并修改我们的片段不使用AsyncTasks。现在我们 有一些完全转换的碎片,它很无痛。那里 是我们必须克服的一些成长的痛苦和问题,但是 整体而言,进展顺利。一开始,我们碰到了几个 技术问题/错误,但Square有一个很棒的Google+社区 能够帮助我们完成它。
何时使用Volley?!
当我们需要加载图像以及使用REST API时我们可以使用Volley!同时需要许多n / w请求的网络呼叫排队系统! Volley还有比Retrofit更好的与内存相关的错误处理!
OkHttp 可以与Volley一起使用,Retrofit默认使用 OkHttp !它具有 SPDY 支持,连接池,磁盘缓存,透明压缩!最近,它通过 Okio 库得到了一些java NIO的支持。
来源,信誉:Josh Ruesch先生的volley-vs-retrofit
注意:关于流式传输取决于您想要的RTSP / RTCP类型。
答案 2 :(得分:44)
RoboSpice与排球
来自https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ
答案 3 :(得分:20)
AFNetworking for 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网络库支持响应缓存,可以完全避免网络重复请求
谢谢:图书馆由我创建
答案 4 :(得分:18)
异步HTTP客户端loopj与Volley
我的项目的细节是每隔1-5分钟发送一次小的HTTP REST请求。
我使用异步HTTP客户端(1.4.1)很长一段时间。性能优于使用vanilla Apache httpClient或HTTP URL连接。无论如何,新版本的库对我来说不起作用:库异常切换链回调。
阅读所有答案促使我尝试新事物。我选择了Volley HTTP库。
使用它一段时间后,即使没有经过测试,我也清楚地看到响应时间降至1.5x,2x Volley。
也许Retrofit比异步HTTP客户端更好?我需要尝试一下。 但我确定Volley不适合我。
答案 5 :(得分:11)
从我与Volley一起工作的经验中加入一些讨论:
Volley不会在任何意义上处理流媒体上传或下载。也就是说,整个请求体必须在内存中,你不能使用OutputStream
将请求体写入底层套接字,也不能使用InputStream
来读取响应体,作为基本HttpURLConnection
。因此,Volley是上传或下载大文件的不良选择。您的请求和响应应该很小。这是我个人遇到的排球的最大限制之一。对于它的价值,OkHttp确实有用于处理流的接口。
缺乏官方文档很烦人,虽然我已经能够通过阅读源代码解决这个问题,这很容易理解。更令人讨厌的是,据我所知,Volley没有正式发布版本,也没有Maven或Gradle工件,因此将其作为依赖项管理比使用Square所发布的任何库更令人头疼。 。你只需克隆一个仓库,建立一个罐子,你自己就可以了。寻找错误修复?抓住并希望它在那里。你也可能得到一些其他的东西;它不会被记录下来。在我看来,这实际上意味着Volley是一个不受支持的第三方库,即使代码库相当活跃。注意事项。
作为一个尼特,将Content-Type绑定到类/请求类型(JsonObjectRequest,ImageRequest等)是一种尴尬,并且稍微降低了调用代码的灵活性,因为你依赖于Volley现有的Request类型层次结构。我喜欢将Content-Type设置为标题的直截了当(顺便说一句,不要使用Volley;最后你会得到两个Content-Type标题!)。这只是我个人的意见,而且可以解决。
这并不是说Volley没有一些有用的功能。当然可以。易于定制的重试策略,透明缓存,取消API以及对请求调度和并发连接的支持是很棒的功能。只知道它并非适用于所有HTTP用例(参见上面的第1项),并且在您的应用程序中将Volley投入生产使用会引起一些麻烦(第2项)。
答案 6 :(得分:9)
我最近发现了一个名为ion的lib,它为表格带来了额外的一点。
ion内置支持与ImageView集成的图像下载,JSON(在GSON的帮助下),文件和非常方便的UI线程支持。
我在一个新项目中使用它,到目前为止结果都很好。它的使用比Volley或Retrofit简单得多。
答案 7 :(得分:4)
添加到已接受的答案以及LOG_TAG所说的....为了让Volley在后台线程中解析您的数据,您必须继承Request<YourClassName>
,因为在主线程上调用onResponse
方法并进行解析如果您的响应很大,主线程上的UI可能会导致延迟。
请阅读here了解如何操作。
答案 8 :(得分:3)
我在我的应用中使用了两者。
每当我解析嵌套的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
答案 9 :(得分:2)
还有另一种选择: https://github.com/apptik/jus
还有许多其他方便的功能,如标记,变形金刚等。