一个学习Android的iOS开发人员提出的两部分问题,他正在开发一个Android项目,该项目将提出从JSON到图像到音频和视频的流媒体下载的各种请求:
我希望有人能够为每种方法提供一些最佳用例的具体示例。
如果您正在与Web服务通信,请使用Retrofit。如果您正在下载图像,请使用毕加索对等库。如果需要在Retrofit/Picasso之外执行HTTP操作,请使用OkHTTP。
Volley与Retrofit + Picasso大致竞争。好的方面是,它是一个库。在不利的一面,它是一个无证,一个不受支持的库,“把代码扔到墙上,在上面做一个I|O演示”。
编辑-排射现在正式支持谷歌。请参考谷歌开发者指南
据我所知,OkHTTP似乎是这三个中最健壮的
如果可以,Retrofit会自动使用OkHTTP。有一个杰克·沃顿的主旨连接Volley到OkHTTP。
并能处理这个项目的要求(如上所述)。
根据“流媒体”的传统定义,你可能不会使用它们中的任何一个来“流式下载音频和视频”。相反,Android的媒体框架将为你处理这些HTTP请求。
也就是说,如果您打算尝试自己的基于http的流,OkHTTP应该处理这种情况;我不记得Volley会如何处理这种情况。无论是Retrofit还是Picasso都不是为此而设计的。
看看Volley透视图,这里有一些适合您需求的优点:
一方面,Volley完全专注于处理单个的小HTTP请求。因此,如果您的HTTP请求处理有一些怪癖,Volley可能为您提供了一个钩子。另一方面,如果您在图像处理方面有一个怪癖,那么您所拥有的唯一真正的钩子是ImageCache。“不是没有,但也不是很多!”either"。但它有更多的其他优点,比如一旦你定义了你的请求,从一个片段或活动中使用它们是轻松的,不像并行AsyncTasks
Volley的优点和缺点:
那么Volley的优点是什么呢?
Volley可以与Okhttp一起使用(Okhttp的新版本支持NIO以获得更好的性能)
截击问题: 由于Volley是新的,一些东西还不支持,但它是固定的
多部分请求(解决方案:https://github.com/vinaysshenoy/enhanced-volley)
状态码201被视为错误,状态码从200到207现在是成功响应。(固定:# EYZ0)
更新:在最新发布的谷歌凌空,2XX状态代码错误是固定现在!感谢Ficus Kirkpatrick!
它的文档较少,但许多人在github中支持volley,可以在在这里中找到类似java的文档。 在android开发者网站上,你可以找到使用Volley传输网络数据的指南。和凌空源代码可以在谷歌Git
你也可以阅读这个比较Volley的图像加载与毕加索
改造:
它由广场发布,它提供了非常容易使用的REST API(更新:瞧!蔚来汽车支持)
改造的优点:
更新:
版本1.6的OkHttp 2.0现在依赖于Okio来支持io和nio,这使得它更容易访问,存储和处理您的数据使用ByteString和缓冲做一些聪明的事情来节省CPU和内存。(供参考:这让我想起了NIO支持的Koush的开源发明网络库!) 我们可以使用与RxJava一起改造来组合和连接REST调用,使用rxObservables来避免丑陋的回调链(为了避免回调地狱!!)
版本1.6的缺点:
内存相关的错误处理功能不好(在旧版本的Retrofit/OkHttp中)不确定它是否与Java NIO支持的Okio有所改进。
如果我们使用这个函数,最小的线程辅助可以导致回调hell
(以上所有缺点都在新版本的Retrofit 2.0 beta中得到解决)
========================================================================
Android Async vs Volley vs Retrofit性能基准(毫秒,值越低越好):
(供参考,上面的改装基准信息将改善java NIO支持,因为新版本的OKhttp依赖于NIO Okio库)
在所有三个不同重复次数(1 - 25次)的测试中,Volley是 速度从50%到75%不等。翻新的结果令人印象深刻 比AsyncTasks快50%到90%,到达相同的端点 同样的次数。在仪表板测试套件上,这转换了 使加载/解析数据的速度加快几秒钟。这是一个 现实世界的巨大差异。为了使考试公平 AsyncTasks/Volley的times像Retrofit一样包含JSON解析 RetroFit在基准测试中获胜! 最后,我们决定在我们的应用程序中使用Retrofit。不 只是它的速度快得离谱,但它与我们的 现有的架构。我们能够做一个父回调 接口,自动执行错误处理、缓存和 对我们的api来说,分页几乎没有任何努力。为了合并 改造,我们不得不重命名我们的变量,使我们的模型GSON 兼容的,写几个简单的接口,删除功能从 旧的API,并修改我们的片段不使用AsyncTasks。既然我们 有一些片段完全转换,这是相当轻松的。在那里 我们必须克服一些成长的烦恼和问题,但是 总的来说,一切都很顺利。一开始,我们遇到了一些 但是Square有一个很棒的谷歌+社区
RetroFit在基准测试中获胜!
什么时候使用凌空?!
当我们需要加载图像以及使用REST api时,我们可以使用Volley !,网络呼叫排队系统需要同时处理多个n/w请求!# EYZ0
OkHttp可以使用凌空,改装使用OkHttp默认!它有SPDY支持,连接池,磁盘缓存,透明压缩!最近,它通过Okio库获得了java NIO的一些支持。
来源:Josh Ruesch先生的< >强volley-vs-retrofit < / >强
注:# EYZ0
# EYZ0
从# EYZ0
异步HTTP客户端loopj vs. Volley
我的项目的细节是小的HTTP REST请求,每1-5分钟一次。
我使用异步HTTP客户端(1.4.1)很长一段时间。性能优于使用普通的Apache httpClient或HTTP URL连接。无论如何,新版本的库不适合我:库内部异常切断回调链。
阅读所有的答案激励我尝试一些新的东西。我选择了Volley HTTP库。
使用一段时间后,即使没有测试,我清楚地看到,响应时间下降到1.5倍,2倍的排射。
从我与Volley合作的经验来看,我想补充一点:
Volley不处理任何意义上的流媒体上传或下载。也就是说,整个请求体必须在内存中,不能使用OutputStream将请求体写入底层套接字,也不能像基本的HttpURLConnection那样使用InputStream读取响应体。因此,Volley对于上传或下载大文件来说是一个糟糕的选择。您的请求和响应应该很小。这是我个人遇到的《Volley》最大的限制之一。至于它的价值,OkHttp确实有用于处理流的接口。
OutputStream
HttpURLConnection
InputStream
官方文档的缺乏令人恼火,尽管我已经能够通过阅读源代码来解决这个问题,这非常容易理解。更麻烦的是,据我所知,Volley没有正式的发布版本,也没有Maven或Gradle工件,因此将它作为依赖项管理比Square发布的任何库都更令人头疼。你只需要克隆一个回购,做一个罐子,你就靠自己了。寻找bug修复?去拿吧,希望它还在。你可能还会得到一些其他的东西;它不会被记录下来。在我看来,这实际上意味着Volley是一个不受支持的第三方库,即使代码库相当活跃。购者自慎。
总之,将Content-Type绑定到类/请求类型(JsonObjectRequest, ImageRequest等)有点尴尬,并降低了调用代码的灵活性,因为您被绑定到Volley现有的请求类型层次结构中。我喜欢将Content-Type设置为标题的直接性(顺便说一下,不要对Volley这样做;你会得到两个内容类型的头!)不过,这只是我个人的观点,它是可以解决的。
这并不是说Volley没有一些有用的功能。的确如此。易于定制的重试策略、透明缓存、取消API以及对请求调度和并发连接的支持都是很棒的特性。但是要知道它并不适用于所有的HTTP用例(参见上面的第1项),而且在应用程序中将Volley投入生产使用(第2项)会有一些令人头疼的问题。
添加到接受的答案和LOG_TAG说....对于Volley在后台线程中解析你的数据,你必须子类化Request<YourClassName>,因为onResponse方法是在主线程上调用的,如果你的响应很大,在主线程上解析可能会导致UI延迟。
Request<YourClassName>
onResponse
我最近发现了一个名为离子的库,它为表带来了一些额外的功能。
ion拥有内置的图像下载支持,集成了ImageView, JSON(在GSON的帮助下),文件和非常方便的UI线程支持。
我在一个新项目上使用了它,到目前为止效果还不错。它的使用比Volley或Retrofit简单得多。
我在我的应用程序中使用这两种。
当我解析嵌套的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
以及许多其他方便的功能,如标记,变形金刚等。
AFNetworking for Android:
快速的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网络库支持响应缓存,完全避免网络重复请求
谢谢:图书馆是我创建的