一个iOS开发者正在学习Android,正在开发一个Android项目,该项目将会从JSON到图像再到音视频流进行各种请求:
在iOS上,我经常使用AFNetworking项目。Android是否有相应的库?
我已经研究了Square的OkHTTP和Retrofit以及Volley,但还没有通过它们进行开发的经验。我希望有人能提供每个库的最佳用例的实际示例。从我所读到的来看,OkHTTP似乎是这三个库中最强大的,并且可以处理此项目的要求(如上所述)。
一个iOS开发者正在学习Android,正在开发一个Android项目,该项目将会从JSON到图像再到音视频流进行各种请求:
在iOS上,我经常使用AFNetworking项目。Android是否有相应的库?
我已经研究了Square的OkHTTP和Retrofit以及Volley,但还没有通过它们进行开发的经验。我希望有人能提供每个库的最佳用例的实际示例。从我所读到的来看,OkHTTP似乎是这三个库中最强大的,并且可以处理此项目的要求(如上所述)。
在 Volley 的视角下,以下是一些与您需求相关的优势:
Volley 一方面完全专注于处理单个、小型 HTTP 请求。因此,如果您的 HTTP 请求处理存在某些怪癖,Volley 可能会为您提供钩子。另一方面,如果您的图像处理存在怪癖,您唯一真正的钩子就是 ImageCache。"这不是什么,但也不算太多!" 但它还有其他更多的优点,例如一旦定义了请求,从片段或活动中使用它们非常轻松,不像并行 AsyncTasks。
Volley 的优缺点:
Volley 有哪些好处呢?
网络部分不仅限于图片。Volley旨在成为后端的重要组成部分。对于基于简单REST服务的新项目,这可能是一个巨大的优势。
NetworkImageView比Picasso更积极地清理请求,并且在其GC使用模式方面更加保守。NetworkImageView仅依赖于强内存引用,并在为ImageView发出新请求或该ImageView移出屏幕时清除所有请求数据。
性能。本文不会评估这一点,但他们显然已经小心谨慎地处理了内存使用模式。Volley还努力批量回调到主线程以减少上下文切换。
Volley似乎也有futures。如果您感兴趣,请查看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状态码的bug已经修复了!感谢Ficus Kirkpatrick!
虽然文档较少,但许多人在Github上支持volley,可以找到类似Java的文档here。在Android开发者网站上,您可以找到使用Volley传输网络数据的指南Transmitting Network Data Using Volley。Volley源代码可在Google Git找到。
要解决/更改Volley框架的重定向策略,请使用Volley with OkHTTP(如上所述的CommonsWare)
此外,您还可以阅读这篇文章比较Volley和Picasso的图像加载
Retrofit:
它是由Square发布的,提供非常易于使用的REST API(更新:使用NIO支持)
Retrofit的优点:
与Volley相比,Retrofit的REST API代码简洁,提供了优秀的API文档,并在社区中得到良好的支持!将其添加到项目中非常容易。
我们可以使用任何序列化库和错误处理。
更新:
Retrofit 2.0.0-beta2带来了很多非常好的改变。
使用OkHttp 2.0版本的Retrofit 1.6现在依赖于Okio,以支持java.io和java.nio,这使得使用ByteString和Buffer访问、存储和处理数据变得更加容易,可以进行一些聪明的优化,以节省CPU和内存。 (顺便说一下:这让我想起了Koush's OIN库,它支持NIO!)
我们可以使用Retrofit和RxJava结合使用,使用rxObservables组合和链接REST调用,避免丑陋的回调链,从而避免回调地狱!
Retrofit 1.6的缺点:
旧版本的Retrofit/OkHttp在处理内存相关的错误时功能不够完善,但不确定使用支持Java NIO的Okio是否有所改进。
如果我们使用不当,最少的线程辅助可能会导致回调地狱。
(所有上述缺点都已在新版本的Retrofit 2.0 beta中解决)
========================================================================
更新:
Android Async vs Volley vs Retrofit 性能基准测试(毫秒,数值越小越好):
库 | 一个讨论 | 仪表板(7个请求) | 25个讨论 |
---|---|---|---|
AsyncTask | 941 毫秒 | 4,539 毫秒 | 13,957 毫秒 |
Volley | 560 毫秒 | 2,202 毫秒 | 4,275 毫秒 |
Retrofit | 312 毫秒 | 889 毫秒 | 1,059 毫秒 |
何时使用Volley?!
当我们需要加载图像以及消耗REST API时,我们可以使用Volley!对于许多网络请求同时进行的情况,需要网络调用排队系统!此外,Volley比Retrofit具有更好的内存相关错误处理!
OkHttp可以与Volley一起使用,默认情况下,Retrofit使用OkHttp!它支持SPDY,连接池,磁盘缓存,透明压缩!最近,它还使用Okio库获得了一些Java NIO支持。
来源,来源:volley-vs-retrofit by Mr. Josh Ruesch
注意:关于流媒体,这取决于您想要的流媒体类型,例如RTSP / RTCP。
httpmime
库中的MultipartEntityBuilder
。 - BNKRoboSpice与Volley
来自https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ
compile 'com.mcxiaoke.volley:library:1.0.+'
- RobAFNetworking适用于Android:
快速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库。
在使用一段时间后,即使没有测试,我清楚地看到响应时间已经降低到了Volley的1.5倍到2倍。
也许Retrofit比异步HTTP客户端更好?我需要试试。但我确定Volley不适合我。
根据我使用Volley的经验,补充一些讨论:
Volley不处理流式上传或下载。也就是说,整个请求体必须在内存中,并且不能使用OutputStream将请求体写入底层套接字,也不能使用InputStream读取响应体,就像基本的HttpURLConnection一样。因此,如果要上传或下载大文件,Volley是一个糟糕的选择。您的请求和响应应该很小。这是我个人遇到的最大限制之一。值得一提的是,OkHttp确实有用于处理流的接口。
缺乏官方文档令人恼火,尽管我通过阅读源代码来解决了这个问题,源代码非常易于理解。更让人烦恼的是,据我所知,Volley没有官方发布版本,也没有Maven或Gradle工件,因此管理它作为依赖关系比例如Square发布的任何库都更麻烦。您只需克隆一个repo,构建一个jar,然后自己解决。寻找错误修复程序?获取并希望它在那里。您可能还会得到其他一些内容;它将不会被记录。我认为,这实际上意味着Volley是一个不受支持的第三方库,尽管代码库相当活跃。买家自负。
作为一个小问题,将Content-Type绑定到类/请求类型(JsonObjectRequest、ImageRequest等)有点笨拙,并且会使调用代码的灵活性减少一些,因为您被绑定到Volley现有的请求类型层次结构中。我喜欢直接设置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 Manager会为您完成所有工作。在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
还有许多其他方便的功能,如标记、转换器等。