来自学习Android的iOS开发人员的一个分为两个部分的问题,该问题涉及一个Android项目,该项目将提出从JSON到图像到流传输音频和视频的各种请求:
在iOS上,我广泛使用了AFNetworking项目。
我已经阅读了OkHTTP和Square的Retrofit以及Volley,但是还没有与它们一起开发的经验。我希望有人可以为每个案例提供一些最佳用例的具体示例。根据我的阅读,似乎OkHTTP是这三个中最强大的,并且可以满足该项目的要求(如上所述)。
#1 楼
我希望有人可以为每种情况提供一些最佳使用案例的具体示例。
如果与Web服务进行通信,请使用Retrofit。如果要下载图像,请使用对等库Picasso。如果您需要进行Retrofit / Picasso之外的HTTP操作,请使用OkHTTP。Volley与Retrofit + Picasso大致竞争。从好的方面来说,它是一个库。在不利的一面,它是一个没有证件的,不被支持的“在墙上扔代码,并在上面进行I | O演示”库。
编辑-Volley现在已得到Google的正式支持。请参阅Google开发人员指南
据我所读,似乎OkHTTP是3中最强大的。
Retrofit自动使用OkHTTP如果可供使用的话。杰克·沃顿(Jake Wharton)有一个要点,它将Volley连接到OkHTTP。
并可以处理该项目的要求(如上所述)。
按照“流”的传统定义,您可能不会将它们全部用于“流式下载音频和视频”。取而代之的是,Android的媒体框架将为您处理这些HTTP请求。
话虽如此,如果您打算尝试进行自己的基于HTTP的流传输,则OkHTTP应该可以处理这种情况。我不记得Volley如何处理这种情况。改造和毕加索都不是为此目的而设计的。
评论
感谢@CommonsWare提供了简洁的答案,以及有关Volley未记录的steez的注释(获得了这种印象,尤其是与其他项目相比)。绝对可以帮助我摆脱困境。
–阿尔菲·汉森(Alfie Hanssen)
2013年6月3日21:46
@CommonsWare的另一个很好的答案。有人可以跟进RoboSpice如何适应所有这些吗?
–user1923613
13年10月1日在7:15
@ user1923613 github.com/octo-online/robospice如果您正在使用凌空进行网络通话,那么就不需要使用robospice !!,凌空可以完成Robospice进行网络通话的许多工作,Robospice开箱即用地支持REST(使用Spring Android或Google Http Client或Retrofit)。如果您希望通过强大的网络客户端进行快速联网和图像加载,可以进行排球!但您可以替换使用Robospice的常规android异步任务,以获得更好的性能并避免内存泄漏!
– LOG_TAG
2013年11月7日10:47
@frostymarvelous:我觉得没有文件证明和无根据就绰绰有余了。并不是说Google缺少一个系统来更正式地处理类似这样的内容(例如Android支持库)。从得到这个答案以来的两年中,从积极的方面来说,社区提供了一些支持,包括将代码非正式地打包为工件。
– CommonsWare
15年8月11日在23:40
@AbhinavVutukuri:您正在评论两年多以前的答案。当时,没有文档。
– CommonsWare
16 Sep 8'在10:56
#2 楼
从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是新的,因此尚不支持某些功能,但已修复。
多部分请求(解决方案: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上找到。
要解决/更改排球框架的重定向策略,请将排球与OkHTTP(上面提到的CommonsWare)配合使用
也可以通过以下方式阅读比较排球的图像: Picasso
改造:
它由Square发布,它提供了非常易于使用的REST API(更新:Voila !,具有NIO支持)
优点Retrofit的简介:
与Volley相比,Retrofit的REST API代码简短,并提供了出色的API文档,并在社区中提供了良好的支持!
非常容易添加到项目中。
我们可以将其与任何具有错误处理功能的序列化库一起使用。
更新:
-Retrofit 2.0.0-有很多非常好的更改。使用OkHttp 2.0的Beta2的Retrofit版本1.6现在依赖于Okio支持java.io和java.nio,这使得使用ByteString和缓冲做一些聪明的事节省CPU和内存。 (仅供参考:这让我想起了具有NIO支持的Koush的OIN库!)
我们可以将Retrofit与RxJava一起使用,以使用rxObservables组合并链接REST调用,以避免难看的回调链(避免回调地狱!!)。
版本1.6的缺点:
与内存相关的错误处理功能不好(在Retrofit / OkHttp的旧版本中),不确定带有Java NIO支持的Okio是否会改进它。
如果我们以不正确的方式使用此方法,则最少的线程帮助可能会导致地狱。
(以上所有缺点都已在Retrofit 2.0 beta的新版本中得到解决)< br
================================ =============================
更新:
Android Async vs Volley vs Retrofit性能基准(毫秒,值越低越好):
(FITI以上Retrofit Benchmarks信息将通过Java NIO支持得到改善,因为新版本的OKhttp是取决于NIO Okio库)
在所有三个具有不同重复次数的测试中(1 – 25次),Volley的速度要快50%至75%。翻新的速度比AsyncTasks快50%到90%,击中相同的端点次数相同。在Dashboard测试套件上,这可以将
转换为更快地加载/解析数据几秒钟。这是现实世界的巨大差异。为了使测试公平,
与Retrofit一样,AsyncTasks / Volley包含了JSON解析
,它会自动为您
。
RetroFit在基准测试中获胜! />
最后,我们决定将Retrofit用于我们的应用程序。
不仅速度快得离谱,而且与我们现有的体系结构也很好地结合在一起。我们能够制作一个父级Callback
接口,该接口可以自动执行错误处理,缓存和
分页,而我们的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。
评论
@ Jan1337z +1信息!我已经更新了它!android.googlesource.com/platform/frameworks/volley
– LOG_TAG
13-10-15在3:57
@LOG_TAG,在您的示例中对RoboSpice进行基准测试会很有趣。我们甚至提供了Retrofit模块,因此我相信这将需要很少的更改。来源在某处吗? RS的优点是可以正确处理执行网络请求的活动的生命周期,并且我们还提供透明的缓存,我想与纯更新请求相比,开销会很小。
–尼古拉斯
2014年4月24日在7:44
@Snicolas我是Josh Ruesch博客获得的基准测试结果,您可以看到Ficus Kirkpatrick(Volley创始人)和Josh Ruesch之间的转换!他尚未在任何地方共享基准测试项目!仅供参考,我刚刚开始学习您的RoboSpice,并带有面对此通知问题的改装样品:)
– LOG_TAG
14-4-24在8:20
嗨!关于Volley的Multipart Request,我认为我们可以在httpmime库中使用MultipartEntityBuilder。
– BNK
15年8月13日在1:30
是否还有其他人验证了这些基准?由于M中不推荐使用apache http库(并且我将其用于multipart builder),因此我决定将网络代码迁移到Retrofit。最初,我更改了GET调用中的一个以从服务器获取一堆对象。我为Retrofit vs AsyncTask计时(使用我自己的JSON解析)。该性能非常接近,未达到该表的“一次讨论”列所示的3倍改进。当然,生成的代码更加简洁,我不必编写自己的JSON解析器,但是对于单个GET请求,并没有改善。
–加里·基普尼斯(Gary Kipnis)
16年6月11日在8:55
#3 楼
RoboSpice与Volley来自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上可用。排球很难找到;)
评论
Robospice使用android服务进行REST调用,我们可以将Robospice与Retrofit结合使用,以最小化gson解析工作,就像我们可以将Volley(基于踩踏)与Robospice一起使用一样? (不确定要问的是正确的qsn)我只是在搜索带服务的凌空抽射!
– LOG_TAG
14年4月23日在10:02
带服务的排球基本上是RS。或者,按时间顺序讲,Volley是RS,没有服务,缺少其他一些功能。是的,您可以将Retrofit与RS结合使用,如果愿意,还可以添加okhttp。
–尼古拉斯
2014年4月23日在11:46
为什么很难找到齐射?编译'com.mcxiaoke.volley:library:1.0。+'
–抢夺
2014年9月7日下午14:37
@Rob曾经有一段时间mcxiaoke的克隆不可用。您必须在应用程序中手动包括凌空抽烟。
–frostymarvelous
2015年8月11日23:32
“ volley将在主线程上反序列化您的POJO”。如果有问题,您可以接收返回的JSON数据,并在另一个线程上自行反序列化。
– AndroidDev
2015年9月9日下午16:12
#4 楼
适用于Android的AFNetworking:快速Android联网在这里
快速Android联网库支持所有类型的HTTP / HTTPS请求,例如GET,POST,DELETE,HEAD,PUT,PATCH
快速Android网络库支持下载任何类型的文件
快速Android网络库支持上传任何类型的文件(支持分段上传)
快速Android联网库支持取消请求
快速Android联网库支持为任何请求(低,中,高,立即)设置优先级
快捷Android联网库支持RxJava
由于使用OkHttp作为网络层,因此它支持:
快速的Android Networking Library支持HTTP / 2支持,允许所有到同一主机的请求共享一个套接字
快速的Android Networking Library使用连接池来减少请求延迟(如果HTTP / 2不可用)
透明的GZIP缩小了下载大小
快速的Android Networking Library支持响应缓存,可以完全避免网络重复请求
感谢:该库是由我创建的
评论
您声明您的库支持HTTP / 2,但是没有说HTTP / 2支持是否有API要求。我的理解是,低于5.0的Android API级别没有正确的SSL加密方法来支持HTTP / 2。不敲门,只是尝试全面评估您建议的解决方案。
– DoctorD
16年9月1日在14:29
@AmitShekhar:我只是想知道哪一个最适合在Android中进行API调用。我正在使用Android Networking Library,那么对实施Retrofit,Volley或Android Networking来说哪个很棒?
–Parth Bhayani
18年11月16日在11:53
@Amit Shekhar快速Android网络对多部分图像上传的效率如何,尤其是在互联网流量较低的情况下?
–user3135923
19年6月17日在8:05
#5 楼
异步HTTP客户端循环与Volley的对比我的项目的详细信息是每1-5分钟发送一次小的HTTP REST请求。
我使用异步HTTP客户端(1.4.1 ) 需很长时间。与使用普通的Apache httpClient或HTTP URL连接相比,该性能更好。无论如何,新版本的库对我不起作用:库间异常中断了回调链。
阅读所有答案促使我尝试了一些新方法。我选择了Volley HTTP库。
使用了一段时间后,即使没有进行测试,我也清楚地看到响应时间降至Volx的1.5倍和2倍。
也许Retrofit比异步HTTP客户端更好?我需要尝试。
但我确定Volley不适合我。
评论
关于Retrofit Vs AsyncHttpClient的任何分析如果是,请发布@Sergey
–IshRoid
15年9月28日在17:01
instructure.github.io/blog/2013/12/09/volley-vs-retrofit
– surya
16年6月7日在6:11
我使用AsyncHttpClient已有几年了。糟糕的是,github回购是2年无提交的。
–Vitor雨果·施瓦布
17-10-26在3:04
它不再实际,异步http太过时了。考虑更改到另一个库。排球也成为非常好的选择。
–谢尔盖·瓦库连科(Sergey Vakulenko)
18年1月31日在14:55
Sergey,@IshRoid我仍在寻找您问题的答复我正在使用AsyncHttpClient我应该使用RxJava Retrofit之类的东西还是其他任何东西..请让我知道..急切地等待答复
–深戴夫
18年4月9日在21:37
#6 楼
只是为了增加我在Volley工作中的经验而引起的讨论:Volley不会以任何方式处理流式上载或下载。也就是说,整个请求正文必须在内存中,并且您不能使用
OutputStream
将请求正文写入基础套接字,也不能像基本InputStream
一样使用HttpURLConnection
读取响应正文。因此,Volley是上传或下载大文件的不佳选择。您的要求和回应应该很小。这是我亲自遇到的Volley的最大限制之一。就其价值而言,OkHttp确实具有用于处理流的接口。缺少官方文档很烦人,尽管我已经能够通过阅读源代码来解决此问题,这很容易理解。更麻烦的是,据我所知,Volley没有正式发行版本,也没有Maven或Gradle构件,因此将其作为依赖项进行管理比任何Square发行的库都更加令人头疼。您只需克隆一个回购库,构建一个jar,就可以自己完成工作了。寻找错误修正?获取并希望它在那里。您可能还会得到一些其他东西。它不会被记录下来。我认为,即使代码库相当活跃,这实际上也意味着Volley是不受支持的第三方库。警告申领者。
作为一种形式,将Content-Type绑定到类/请求类型(JsonObjectRequest,ImageRequest等)有点尴尬,并且由于绑定而使调用代码的灵活性有所降低到Volley现有的Request类型层次结构。我喜欢直接将Content-Type设置为标头的简单性(顺便说一下,不要对Volley这样做;您最终将获得两个Content-Type标头!)。不过,这只是我个人的观点,可以解决。
这并不是说Volley没有某些有用的功能。当然可以。轻松自定义的重试策略,透明的缓存,取消API以及对请求调度和并发连接的支持都是很棒的功能。只知道它并不适用于所有HTTP用例(请参阅上面的项目1),并且在应用程序中将Volley投入生产使用时涉及一些麻烦(项目2)。
评论
满载的内存是我慢慢杀死我的东西。感谢上帝,有人提到了它。
–晴天
16年1月28日在8:44
该库还可以为您的请求正文提供防御性的副本,因此大型请求的内存消耗可能是您期望的两倍。
–杰夫
16年1月29日在15:35
#7 楼
我最近发现了一个名为ion的库,它为表带来了一些额外的好处。ion内置了对与ImageView,JSON(在GSON的帮助下),文件,文件以及非常方便的UI线程支持集成的图像下载的支持。
在新项目上使用它,到目前为止效果很好。它的使用比Volley或Retrofit简单得多。
评论
离子vs改型,您会推荐哪一种?
– Sreekanth Karumanaghat
16年4月20日在8:48
改造胜于离子
–拉杰什·科什蒂(Rajesh Koshti)
16年11月8日在6:19
#8 楼
添加到接受的答案和LOG_TAG所说的....要让Volley在后台线程中解析数据,您必须将Request<YourClassName>
子类化,因为在主线程上调用了onResponse
方法,并且在主线程上进行解析可能会导致UI滞后您的反应很大。请阅读此处的操作方法。
评论
是的...当响应很大时,凌空解析主线程的响应,这会导致ui滞后。
– Gopal Singh Sirvi
15年6月29日在11:46
#9 楼
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
#10 楼
还有另一个选择:与Volley一样,它是模块化的,但扩展性更强,文档也在不断完善,支持不同的HTTP堆栈。
https://github.com/apptik/jus
开箱即用的转换器和转换器
它具有一个生成服务器API接口映射的模块,例如Retrofit
,还具有JavaRx支持
以及许多其他方便的功能,例如标记,转换器等。
评论
如果使用的是HttpUrlConnection的内部实现,则应考虑HttpUrlConnection对POST请求使用静默重试。那对我造成了很多伤害。有关更多信息,请阅读此处:stackoverflow.com/a/37675253/2061089如果任何人需要所有网络库的列表,可以在我的博客文章androidredman.wordpress.com/2017/06/26/…
上找到它
Volley可以运行旧版Apache,HttpUrlConnection,Apache-4或OkHttp。 Retrofit真正只在哪里运行OkHttp。改造容易得多。