网络框架分类
(一)底层网络框架
HttpClient, HttpURLConnection,OkHttp 属于底层的网络框架,这些框架是底层真正发起http请求的。
1.HttpClient是Apache公司提供的原始的http协议库,在2.2之前,官方推荐使用HttpClient.
优点:功能丰富,非常稳定,bug极少
缺点:数量众多的API使得在保证兼容的情况下很难改进,这也是Google官方放弃HttpClient的主要原因
发展:2.2之前HttpClient是最佳选择,2.3之后, Google官方建议使用HttpURLConnection.
Android6.0以后Google官方Api移除HttpClient
httpclient Android6.0问题及解决
问题:Android6.0以后Google官方Api移除HttpClient,继续使用HttpClient及基于其封装的网络库会出异常
解决:在 build.gradle 文件中声明以下编译时依赖项:
android {
useLibrary ‘org.apache.http.legacy’
}
2.HttpURLConnection是Sun公司提供的原始的http协议库,也是Java的标准类库java.net中的一员
优点:HttpURLConnection 是通用的轻量级的 HTTP 客户端工具,适用于大部分应用程序。
增加了压缩(2.3)和缓存(4.0),减少了网络使用,提高了速度,节省了电量
因为API较少,所以可以在保证兼容性的前提下做改进,这也是官方选择HttpURLConnection取代HttpClient的主要原因2.2之前存在的问题及解决
在 Android 2.2 之前的版本中,存在一些 bug;尤其是在可读的输入流中调用 close(),会污染连接池
解决:关闭连接池以保证正常使用
3.okhttp是 Square 公司开源的针对 Java 和 Android 程序,封装的一个高性能 http 请求库。Android 4.4后,HttpURLConnection底层实现使用的就是OkHttp,在 Android 6.0 中底层的源码已经使用了 OKHttp
优点:a.对同一个主机发出的所有请求都可以共享相同的套接字连接
b.使用连接池来复用连接以提高效率
c.提供了对 GZIP 的默认支持来降低传输内容的大小
d.对 HTTP 响应的缓存机制,可以避免不必要的网络请求
e.当网络出现问题时,OkHttp 会自动重试一个主机的多个 IP 地址
f.支持同步阻塞请求和异步请求两种方式
g.支持Android2.3+ java 1.7+
h.基于NIO与OKIO,所以效率更高
i. 支持 spdy、http 2.0、websocket ,支持同步、异步,而且 OkHttp 又封装了线程池,封装了数据转换,封装 了参数使用、错误处理等,api 使用起来更加方边
缺点:使用是需要进行一次封装
(二)封装的网络框架
Android-async-http, Volley, retrofit属于对底层网络框架的封装,比如Volley内部使用的就是HttpURLConnection和 HttpClient, retrofit是 基于OkHttp 的封装
1.Android-async-http 是一个强大的网络请求库,这个网络请求库是基于 Apache HttpClient 库之上的一个异步网络请 求处理库,网络处理均基于 Android 的非 UI 线程,通过回调方法处理请求结果。 可惜的是 Android 6.0 (api 23) SDK,不再提供 org.apache.http.* (只保留几个类)。
优点:a. 在匿名回调中处理请求结果
b. 在 UI 线程外进行 http 请求
c. 文件断点上传
d. 智能重试
e. 默认 gzip 压缩
f. 支持解析成 Json 格式
g. 可将 Cookies 持久化到 SharedPreference
缺点:Android5.0以后不推荐使用HttpClient,作者已停止更新
2.Volley是2013年Google I/O大会上推出的一套小而巧的异步请求库,该框架封装的扩展性很强,支持 HttpClient、HttpUrlConnection,甚至支持 OkHttp。而且 Volley 里面也封装了 ImageLoader ,所以如果你愿意 你甚至不需要使用图片加载框架,不过这块功能没有一些专门的图片加载框架强大,对于简单的需求可以使用,对于稍复 杂点的需求还是需要用到专门的图片加载框架
优点: a.自动调度网络请求;
b.高并发网络连接;
c.通过标准的 HTTP cache coherence(高速缓存一致性)缓存磁盘和内存透明的响应;
d.支持指定请求的优先级( 请求队列的优先级排序);
e. 提供多样的取消机制:网络请求 cancel 机制,我们可以取消单个请求,或者指定取消请求队 列中的一个区域;
f.框架容易被定制,例如,定制重试或者回退功能;
g.包含了调试与追踪工具;
h.默认 Android2.3 及以上基于 HttpURLConnection,2.3 以下使用基于 HttpClient
i.提供简便的图片加载工具(其实图片的加载才是我们最为看重的功能)
缺点: 不能下载文件
3.Retrofit与okhttp一样出自于Square公司。Retrofit是一套 RESTful 网络框架,底层网络框架使用的是 OkHttp(Retrofit 2.0开始不支持其他底层网络框架)
优点: a.支持 okhttp
b.注解处理,简化代码
c.支持上传和下载文件
d.支持自己更换解析方式 ,比如你可以自定义json解析框架比如Gson,Jackson等
e.支持多种http请求库
f.支持RxJava,这也是很多人选择它的原因。
缺点:门槛较高,学习成本高
目前 RxJava+Retrofit+OkHttp + Dagger2 是网络框架最好的选择了
框架学习: https://blog.csdn.net/wb_001/article/details/76922779
Retrofit学习: https://blog.csdn.net/qq_36347817/article/details/80636418
Rxjava学习 :http://gank.io/post/560e15be2dca930e00da1083#toc_1
OKHttp学习:
Dagger2学习:
(三)大而全的框架
Afinal和xUtils等大而全的框架,包括网络框架,数据库,图片加载等,不建议使用这类的框架,不好维护,并且这种框架在每个模块都做的不精。
接下来我们来看下我们国人封装的两个框架 Afinal 框架和 xUtils ,这两个框架的作者已经停止更新了,因此现在就不推荐使用了
1.Afinal 是一个 android 的 sqlite orm 和 ioc 框架。同时封装了android中的http框架,使其更加简单易用;使用 finalBitmap,无需考虑 bitmap 在 android 中加载的时候 oom 的问题和快速滑动的时候图片加载位置错位等问题。Afinal的宗旨是简洁,快速。约定大于配置的方式。尽量一行代码完成所有事情。Afinal主要是分四个模块:
(1) 数据库模块(2) 注解模块 (3) 网络模块(4) 图片缓存模块
2.xUtils跟Afinal是同类型的框架, 现在作者已经两三年前就没有进行更新了。
上面网络框架其实就个人而已,就不推荐使用了,要不就是功能太过丰富,如果在主流的 app 中使用,对后期的维护, 代价就很大了。比如你发现你框架中不适合使用某个功能,需要替换这部分的框架,你就会发现,你整个项目都不出现这个框架的影子,对于后期维护的成本实在是太大了!
总结:后面的几个网路框架(okhttp , retrofit)是目前较好的网络框架,在公司也发现,很多项目都是使用这几个网络框架的。这两个网络开源框架都是 square 公司提供的,在开源界中,有两家公司提供的网络框架是非常丰富的,一个是 square 和 Facebook ,真心感谢这两个公司。