来自学习Android的iOS开发人员的一个分为两个部分的问题,该问题涉及一个Android项目,该项目将提出从JSON到图像到流传输音频和视频的各种请求:


在iOS上,我广泛使用了AFNetworking项目。
我已经阅读了OkHTTP和Square的Retrofit以及Volley,但是还没有与它们一起开发的经验。我希望有人可以为每个案例提供一些最佳用例的具体示例。根据我的阅读,似乎OkHTTP是这三个中最强大的,并且可以满足该项目的要求(如上所述)。


评论

如果使用的是HttpUrlConnection的内部实现,则应考虑HttpUrlConnection对POST请求使用静默重试。那对我造成了很多伤害。有关更多信息,请阅读此处:stackoverflow.com/a/37675253/2061089

如果任何人需要所有网络库的列表,可以在我的博客文章androidredman.wordpress.com/2017/06/26/…
上找到它
Volley可以运行旧版Apache,HttpUrlConnection,Apache-4或OkHttp。 Retrofit真正只在哪里运行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 Kosht​​i)
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支持

以及许多其他方便的功能,例如标记,转换器等。