思维导图
一、为什么要使用网络开源框架
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)封装好的类库,并实现另开线程进行请求和处理数据,从而实现整个网络请求模块的功能。具体的关系可看下图:
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,扩展性不好对他们高超的重构和封装技巧不再是问题。