思维导图
Android 开源网络框架(Android-Async-Http、Volley、OkHttp3、Retrofit2.0)对比_第1张图片


一、为什么要使用网络开源框架 1. Android系统自带网络请求 Android系统自带的网络请求模块有两个,一个是HttpClient,另一个是HttpUrlConnection。
1.1. HttpUrlConnection HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。
不过在Android 2.2版本之前,HttpURLConnection一直存在着一些令人厌烦的bug。比如说对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了。那么我们通常的解决办法就是直接禁用掉连接池的功能,所以Android2.2以前是推荐用HttpClient的。
而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。
1.2. HttpClient DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。 但同时也由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不积极。
3. 存在的问题 ①上述两个框架并没有针对异步调用的一个封装,使用时必须自己去new一个线程; ②没有线程池,没有网络缓存,不能重复利用请求,性能不佳; ③返回的数据必须自己解析,没有json解析框架。
2. 网络开源框架的可以解决那些问题
网络请求开源库是一个将网络请求的相关功能封装好的类库,并对外提供Api:
没有网络请求框架之前 App想与服务器进行网络请求交互是一件很痛苦的事: 因为Android的主线程不能进行网络请求,还需要另外开一个线程进行请求,然后又要考虑到线程池,缓存等一堆问题。
使用网络请求框架后 实现网络请求的需求同时不需要考虑: 异步请求、线程池、缓存、json解析
  • 同时还: 降低开发难度,缩短开发周期,使用方便
    、目前流行的网络框架
1. 目前流行的网络框架有哪些 目前流行的框架主要有四种:Android-Async-Http、Volley、OkHttp3、Retrofit2.0
网络请求框架本质上是一个将网络请求的相关方法( HttpClient或HttpURLConnection)封装好的类库,并实现另开线程进行请求和处理数据,从而实现整个网络请求模块的功能。具体的关系可看下图: Android 开源网络框架(Android-Async-Http、Volley、OkHttp3、Retrofit2.0)对比_第2张图片
2. Android-Async-Http 推出的时间最早,目前作者已经停止更新,Android 5.0后不推荐使用。特点: ①自动智能请求重试 ②支持同步、异步请求 ③保存cookie到应用的sharepreference 自动智能请求重试在很多APP中比较鸡肋,在很多下拉刷新的APP中用户体验很不好,而且框架中自动重试是默认开启的,需要去显式的关闭。
3. Volley 基于HttpUrlConnection,Volley的request请求和response都是把数据放在byte数组里,不支持输入输出流。如果大文件多了,数组就会非常大,消耗内存,所以volley不适用下载和上传文件的网络操作。适合轻量级网络交互,网络请求频繁,传输数据量小的场景。 ①封装了UIL图片加载框架,支持图片加载 ②网络请求排序,优先级处理 ③多级别取消 ④和activity生命舟曲联动,生命周期结束同时取消所有网络请求 ⑤扩展性好,可支持okhttp

4. OkHttp3 不基于HttpClient和HttpUrlConnection,是比前两种更高性能的网络请求,它是一个封装类似HttpUrlConnection的一个东西,Android 4.4之后HttpUrlConnnection部分实现已经与okhttp一致,证明了okhttp的高性能。特点: ①支持PDY,共享同一个socket来处理同一个服务器的所有请求 ②支持同步、异步请求 ③保存cookie到应用的sharepreference ④封装了线程池、数据转换、参数使用、错误处理等 ⑤无缝的支持GZIP来减少数据流量,使用比HttpUrlConnection更方便 ⑥缓存响应数据来较少重复的网络请求 ⑦能从很多常用的连接问题中自动恢复 ⑧解决了代理服务器问题和SSL握手失败问题 ⑨基于NIO和okio,所以性能更好,请求、处理速度快
5. Retrofit2.0 基于Okhttp,而且更为出色,具有okhttp所有的优点,而且 ①restful api设计风格 ②通过注解配置请求,包括请求方法、请求参数、请求头、返回值等 ③可以搭配多种Converter将获得的数据解析,支持Gson、jackson、Protobur等 ④提供Rxjava支持
Retrofit2.0性能最好,简洁易用,可扩展rxjava,但是缺点也很明显,注解、rxjava等的使用存在很高的门槛;扩展性较差,高度封装后的必然结果。
三、总结 我们分析了Android系统自带和网络请求模块和存在的问题,针对这些问题,我们分析了现在流行的网络请求框架他们各自的特点。那么到底哪一种最适合你呢,我的观点是要根据不同的阶段。
初级工程师往往对网络请求一知半解,如果贸然使用了retrfit2.0,不单各种的注解会迷惑,熟练的掌握了使用方法后,对于线程池、缓存为什么好不会有很实际的认知,需要研究源码和大量理论,如何将他们串联起来是个问题。所以这个阶段首先是去基于HttpClient、HttpUrlConnection做一些简单的封装,然后你才会真实的了解到请求封装、线程池封装的好处。
中级工程师工程阶段任务大多是根据业务需求设计某个模块,网络框架可能已经选好,你首先要去了解这个网络框架中内部的原理,有哪些特性,可以解决遇到的问题吗,不能解决就去寻找一个开源方案,这个解决的方案不能是一个全新的网络框架,一个项目存在两个网络框架往往会带来很多问题,而且架构师基于性能的考虑也是不会允许的。所以为解决一个小问题,往往适合去寻找或者自行设计一个尽可能小的封装。所以这个阶段就是了解已定好的网络框架内部原理。
高级工程师一般是一个项目中担任架构选型的任务,他们已然了解了http请求、线程池、缓存的知识,基于以往项目的经验,选择一个高性能、简洁易用的网络架构,那么基于okhttp封装的retrofit2.0是不二选择,而且支持converter扩展和rxjava,扩展性不好对他们高超的重构和封装技巧不再是问题。

更多相关文章

  1. Android -- ViewRoot,关于子线程刷新UI
  2. 高焕堂——Android框架底层结构知多少?
  3. Android 常用开源框架汇总
  4. Android中android-async-http开源网络框架的简单使用
  5. Android之网络连接判断
  6. Android 中如何关闭线程

随机推荐

  1. 十二个android编程技巧
  2. Android 官方文档 Google Services
  3. Android SDK 版本的简称
  4. 手动生成Android的R.java文件
  5. Android app not full screen on Smartq7
  6. 开始android
  7. android不同应用程序之间启动Activity
  8. Android 中mkdir() 和mkdirs()创建目录的
  9. Android 开发中遇到的 bug(9)
  10. Android(安卓)抽象布局include merge Vie