来自学习Android的iOS开发人员的两部分问题,该问题涉及一个Android项目,该项目将提出从JSON到图像到音频和视频流下载的各种请求:
在iOS上,我广泛使用了AFNetworking项目。是否有适用于Android的等效库?
我已经阅读了Square的OkHTTP和Retrofit,以及Volley,但还没有与它们一起开发的经验。我希望有人可以为每个案例提供一些最佳用例的具体示例。根据我的阅读,似乎OkHTTP是这三个中最强大的,并且可以满足该项目的要求(如上所述)。
来自学习Android的iOS开发人员的两部分问题,该问题涉及一个Android项目,该项目将提出从JSON到图像到音频和视频流下载的各种请求:
在iOS上,我广泛使用了AFNetworking项目。是否有适用于Android的等效库?
我已经阅读了Square的OkHTTP和Retrofit,以及Volley,但还没有与它们一起开发的经验。我希望有人可以为每个案例提供一些最佳用例的具体示例。根据我的阅读,似乎OkHTTP是这三个中最强大的,并且可以满足该项目的要求(如上所述)。
Answers:
我希望有人可以为每个案例提供一些最佳用例的具体示例。
如果要与Web服务通信,请使用Retrofit。如果要下载图像,请使用对等库Picasso。如果需要执行Retrofit / Picasso之外的HTTP操作,请使用OkHTTP。
排球大致与Retrofit + Picasso竞争。从好的方面来说,它是一个库。不利的一面是,这是一个没有证件的,不受支持的“将代码扔在墙上,并在上面进行I | O演示”的库。
编辑-Volley现在由Google正式支持。请参考Google开发者指南
根据我的阅读,似乎OkHTTP是3种中最强大的
如果可用,Retrofit自动使用OkHTTP。杰克·沃顿(Jake Wharton)有一个要点,它将Volley连接到OkHTTP。
并可以满足该项目的要求(如上所述)。
按照“流”的传统定义,您可能不会将它们全部用于“流式下载音频和视频”。相反,Android的媒体框架将为您处理这些HTTP请求。
话虽如此,如果您打算尝试进行自己的基于HTTP的流传输,则OkHTTP应该可以处理这种情况。我不记得Volley将如何处理这种情况。Retrofit和Picasso都不是为此目的而设计的。
从Volley的角度看,这里有一些您需要的优点:
一方面,Volley完全专注于处理单个的小型HTTP请求。因此,如果您的HTTP请求处理有一些怪癖,Volley可能会为您提供帮助。另一方面,如果您在图像处理方面有一个怪癖,那么唯一拥有的真正钩子就是ImageCache。“也不是没有,但也不是很多!”。但它具有更多其他优点,例如,一旦定义了请求,就可以在片段或活动中使用请求,这与并行AsyncTasks一样轻松
凌空抽射的利弊:
那么Volley有什么好处呢?
网络部分不仅用于图像。Volley旨在成为您后端不可或缺的一部分。对于基于简单REST服务的全新项目,这可能是一个巨大的胜利。
与Picasso相比,NetworkImageView在请求清除方面更具攻击性,并且在GC使用模式方面更为保守。NetworkImageView仅依赖于强大的内存引用,并在对ImageView发出新请求时或在ImageView移出屏幕后立即清除所有请求数据。
性能。这篇文章不会评估这种说法,但是他们显然已经谨慎考虑了它们的内存使用模式。Volley还努力将回调批处理到主线程,以减少上下文切换。
齐射显然也有期货。如果有兴趣,请查看RequestFuture。
如果您要处理高分辨率的压缩图像,Volley是这里唯一运作良好的解决方案。
Volley可以与Okhttp一起使用(新版本的Okhttp支持NIO以获得更好的性能)
排球在“活动”生命周期中发挥了很好的作用。
Volley的问题:
由于Volley是新的,因此尚不支持某些功能,但已修复。
多部分请求(解决方案:https : //github.com/vinaysshenoy/enhanced-volley)
状态代码201被视为错误,状态代码从200到207现在已成功响应。(修复:https : //github.com/Vinayrraj/CustomVolley)
更新:在谷歌抽射最新版本中,2xx状态代码错误是固定的,现在由于榕帕特里克!
它的文档较少,但是许多人在github中支持volley,可以在此处找到类似Java的文档。在android开发人员网站上,您可以找到使用Volley传输网络数据的指南。凌空源代码可以在Google Git中找到
要解决/更改Volley Framework的 重定向策略,请将Volley与OkHTTP配合使用(上面提到的CommonsWare)
您也可以阅读与毕加索比较《凌空凌空》的图像
改造:
它由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,Volley和Retrofit性能基准(毫秒,值越低越好):
(以上更新基准信息的FYI将通过Java NIO支持得到改善,因为新版本的OKhttp依赖于NIO Okio库)
在所有三个具有不同重复次数的测试中(1-25次),Volley的速度提高了50%至75%。翻新的速度比AsyncTasks快50%至90%,到达相同端点的次数相同。在Dashboard测试套件上,这转化为更快地加载/解析数据几秒钟。那是现实世界的巨大差异。为了使测试公平,AsyncTasks / Volley的时间包括了JSON解析,因为Retrofit会自动为您进行解析。
RetroFit在基准测试中获胜!
最后,我们决定将Retrofit用于我们的应用程序。它不仅快得离谱,而且与我们现有的体系结构非常吻合。我们能够制作一个父级回调接口,该接口可以自动执行错误处理,缓存和分页,而对我们的API几乎不需要付出任何努力。为了合并到Retrofit中,我们必须重命名变量以使我们的模型符合GSON规范,编写一些简单的接口,从旧的API中删除函数,并修改片段以不使用AsyncTasks。现在,我们已经完成了一些片段的完全转换,这非常轻松。我们不得不克服一些不断增长的痛苦和问题,但总体而言进展顺利。一开始,我们遇到了一些技术问题/错误,但是Square拥有一个出色的Google+社区,可以帮助我们解决这个问题。
什么时候使用Volley ?!
当我们需要加载图像以及使用REST API时,可以使用Volley !,同时需要多个n / w请求的同时需要网络调用排队系统!而且Volley具有比Retrofit更好的内存相关错误处理!
OkHttp可以与Volley一起使用,Retrofit 默认使用OkHttp!它具有SPDY支持,连接池,磁盘缓存,透明压缩!最近,它通过Okio库获得了对Java NIO的支持。
资料来源:信贷:Josh Ruesch先生的凌空对战改造
注意:关于流,它取决于您想要哪种流类型,例如RTSP / RTCP。
MultipartEntityBuilder
在httpmime
库中使用它。
RoboSpice与 凌空抽射
来自https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ
compile 'com.mcxiaoke.volley:library:1.0.+'
适用于Android的AFNetworking:
快速的Android网络库支持所有类型的HTTP / HTTPS请求,例如GET,POST,DELETE,HEAD,PUT,PATCH
快速的Android网络库支持下载任何类型的文件
快速的Android网络库支持上传任何类型的文件(支持分段上传)
快速的Android网络库支持取消请求
快速的Android网络库支持为任何请求(低,中,高,立即)设置优先级
快速的Android网络库支持RxJava
由于它使用OkHttp作为网络层,因此支持:
快速的Android网络库支持HTTP / 2支持,允许所有到同一主机的请求共享一个套接字
快速Android网络库使用连接池来减少请求延迟(如果HTTP / 2不可用)
透明的GZIP缩小下载大小
快速的Android网络库支持响应缓存,从而完全避免了网络重复请求
谢谢:图书馆是我创建的
异步HTTP客户端loopj与Volley
我的项目的详细信息是每1-5分钟发送一次小的HTTP REST请求。
我长时间使用异步HTTP客户端(1.4.1)。与使用普通的Apache httpClient或HTTP URL连接相比,该性能更好。无论如何,新版本的库对我不起作用:库间异常剪切回调链。
阅读所有答案促使我尝试一些新事物。我选择了Volley HTTP库。
使用一段时间后,即使没有进行测试,我也清楚地看到响应时间下降到1.5倍,2倍凌空。
也许Retrofit比异步HTTP客户端更好?我需要尝试一下。但是我敢肯定,Volley不适合我。
只是为了增加我在Volley工作中的经验而进行的讨论:
Volley不会以任何方式处理流媒体上载或下载。也就是说,整个请求正文都必须在内存中,并且您不能像基本一样使用an OutputStream
将请求正文写入基础套接字,也不能使用an InputStream
来读取响应正文HttpURLConnection
。因此,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)。
我最近发现了一个名为ion的库,它为表带来了一些额外的好处。
ion具有对与ImageView,JSON(在GSON的帮助下),文件以及非常方便的UI线程支持集成的图像下载的内置支持。
我正在新项目上使用它,到目前为止效果很好。它的使用比Volley或Retrofit简单得多。
除了接受的答案和LOG_TAG所说的...之外,为了使Volley能够在后台线程中解析数据,您必须将其子类化,Request<YourClassName>
因为onResponse
在主线程上调用该方法,并且在主线程上进行解析可能会导致UI滞后大。在这里阅读如何做。
我在我的应用程序中同时使用两者。
每当我解析嵌套的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
还有另一个选择:https : //github.com/apptik/jus
以及许多其他方便的功能,例如标记,变压器等。