注册

Android论网络加载框架(Android-async-http,afinal,xUtils,Volley,okhttp,Retrofit)的特点和优缺点

一:HTTP,TCP,UDP,Socket简要介绍


1、TCP


TCP简要介绍


TCP是面向连接的、传输可靠(保证数据正确性且保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。


TCP三次握手


建立一个TCP连接时,需要客户端和服务器总共发送3个包。


  三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在 Socket 编程中,客户端执行connect()时。将触发三次握手。


首先了解一下几个标志,SYN(synchronous),同步标志,ACK (Acknowledgement),即确认标志,seq是Sequence Number(序列号)。


  第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。


  第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的序列号加1以,即X+1。


  第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写序列号的+1。


tcp四次挥手


TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。


为什么连接的时候是三次握手,关闭的时候却是四次挥手?


因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来 同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,” 你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。


TCP的优缺点


优点:


可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。


缺点:


慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。


2、UDP:


面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。


UDP的优点: 快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击…… UDP的


UDP缺点:不可靠,不稳定,因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。


3、HTTP


(1) HTTP简要介绍


HTTP协议即超文本传送协议(HypertextTransfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。


(2) HTTP特点


  HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接,从建立连接到关闭连接的过程称为“一次连接”,因此HTTP连接是一种“短连接”



  • 在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
  • 在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。 

HTTP是基于客户端/服务端(C/S)的架构模型


  客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,


HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。


(3) HTTP优缺点


优点:



  • 基于应用级的接口使用方便
  • 程序员开发水平要求不高,容错性强

缺点:



  • 传输速度慢,数据包大(Http协议中包含辅助应用信息)
  • 如实时交互,服务器性能压力大。
  • 数据传输安全性差

4、Socket


(1) Socket简要介绍


网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。


建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。


(2) Socket优缺点


优点:



  • 传输数据为字节级,传输数据可自定义,数据量小(对于手机应用讲:费用低)
  • 传输数据时间短,性能高
  • 适合于客户端和服务器端之间信息实时交互
  • 可以加密,数据安全性强

Socket缺点:



  • 需对传输的数据进行解析,转化成应用级的数据
  • 对开发人员的开发水平要求高
  • 相对于Http协议传输,增加了开发量

5、TCP HTTP UDP三者的关系:



  • TCP/IP是个协议组,可分为四个层次:网络接口层、网络层、传输层和应用层。
  • 在网络层有:IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
  • 在传输层中有:TCP协议与UDP协议。
  • 在应用层有:FTP、HTTP、TELNET、SMTP、DNS等协议。
  • 因此,HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。

二:HttpURLConnection和httpclient


在Android开发中网络请求是最常用的操作之一, Android SDK中对HTTP(超文本传输协议)也提供了很好的支持,这里包括两种接口:



  • 标准Java接口(java.NET) —-HttpURLConnection,可以实现简单的基于URL请求、响应功能;
  • Apache接口(org.appache.http)—-HttpClient,使用起来更方面更强大。

但在android API23的SDK中Google将HttpClient移除了。Google建议使用httpURLconnection进行网络访问操作。


HttpURLconnection是基于http协议的,支持get,post,put,delete等各种请求方式,最常用的就是get和post,下面针对这两种请求方式进行讲解。


1、HttpURLConnection


在JDK的java.net包中已经提供了访问HTTP协议的基本功能的类:HttpURLConnection。


HttpURLConnection是Java的标准类,它继承自URLConnection,可用于向指定网站发送GET请求、POST请求。


2、httpclient


HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。


三:android常用网络框架


1、Android-async-http


Android-async-http简要介绍


Android-async-http 是一个强大的网络请求库,这个网络请求库是基于 Apache HttpClient 库之上的一个异步网络请求处理库,网络处理均基于 Android 的非 UI 线程,通过回调方法处理请求结果。可惜的是 Android 6.0 (api 23) SDK,不再提供 org.apache.http.* (只保留几个类)。


Android-async-http优点


优点:



  • 在匿名回调中处理请求结果
  • 在 UI 线程外进行 http 请求
  • 文件断点上传
  • 智能重试
  • 默认 gzip 压缩
  • 支持解析成 Json 格式
  • 可将 Cookies 持久化到 SharedPreference

2、afinal


afinal简要介绍


afinal是一个开源的android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少。在android应用开发中,通过afinal的ioc框架,诸如ui绑定,事件绑定,通过注解可以自动绑定。通过afinal的orm框架,无需任何配置信息,一行代码就可以对android的sqlite数据库进行增删改查操作。同时,afinal内嵌了finalHttp等简单易用的工具,可以轻松的对http请求进行操作。


afinal主要组件



  • FinalHttp:用于请求http数据,直接ajax方式请求,文件上传, 断点续传下载文件等
  • FinalBitmap:用于显示bitmap图片,无需考虑线程并发和oom等问题。
  • FinalActivity:完全可以通过注解方式绑定控件和事件,无需编写代码。
  • FinalDb:android中sqlite的orm框架,一行代码搞定增删改查。

afinal特点



  • 设计简单小巧灵活
  • orm零配置,但可以配置,可以通过灵活的注解配置达到更加强大的功能
  • 数据库查询支持DbModel,可以轻松的进行各种复杂的查询
  • android的ui和事件绑定完全通过注解的方式,无需编写一行代码
  • http请求支持ajax方式请求
  • 体积小(不到100KB),不依赖第三方jar包

afinal优缺点


优点
android中的orm框架,一行代码就可以进行增删改查。支持一对多,多对一等查询。


缺点
目前暂时不支持复合主键,并且对SQL语句的支持也非常有限,一些比较复杂的业务逻辑实现非常麻烦!


3、xUtils


xUtils简要介绍


xUtils是基于Afinal开发的目前功能比较完善的一个Android开源框架,最近又发布了xUtil3.0,在增加新功能的同时又提高了框架的性能。


下面来看看官方(github.com/wyouflf/xUt…)对xUtils3的介绍:



  • xUtils包含了很多实用的android工具;
  • xUtils支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响;
  • xUitls最低兼容android 2.2 (api level 8)!
  • xUtils3变化较多所以建立了新的项目不在旧版(github.com/wyouflf/xUtils)上继续维护, 相对于旧版本:
  • HTTP实现替换HttpClient为UrlConnection, 自动解析回调泛型, 更安全的断点续传策略;
  • 支持标准的Cookie策略, 区分domain, path;
  • 事件注解去除不常用的功能, 提高性能;
  • 数据库api简化提高性能, 达到和greenDao一致的性能;
  • 图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转。

xUtils主要组件


目前xUtils主要有四大模块:
ViewUtils模块:



  • android中的ioc(控制倒转)框架,完全注解方式就可以进行UI,资源和事件绑定;
  • 新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
  • 目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。

HttpUtils模块:



  • 支持同步,异步方式的请求;
  • 支持大文件上传,上传大文件不会oom;
  • 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求;
  • 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;
  • 返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。

BitmapUtils模块:



  • 加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
  • 支持加载网络图片和本地图片;
  • 内存管理使用lru算法,更好的管理bitmap内存;
  • 可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等…

DbUtils模块:



  • android中的orm(对象关系映射)框架,一行代码就可以进行增删改查;
  • 支持事务,默认关闭;
  • 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);
  • 支持绑定外键,保存实体时外键关联实体自动保存或更新;
  • 自动加载外键关联实体,支持延时加载;
  • 支持链式表达查询,更直观的查询语义

4、Volley框架


Volley简要介绍


在2013年Google I/O大会上推出了一个新的网络通信框架Volley。Volley既可以访问网络取得数据,也可以加载图片,并且在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。在使用Volley前请下载Volley库并放在libs目录下并add到工程中。


Volley的主要特点



  • 扩展性强。Volley 中大多是基于接口的设计,可配置性强。
  • 一定程度符合 Http 规范,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的处理,请求头的处理,缓存机制的支持等。并支持重试及优先级定义。
  • 默认 Android2.3 及以上基于 HttpURLConnection,2.3 以下基于 HttpClient 实现,这两者的区别及优劣在4.2.1 Volley中具体介绍。
  • 提供简便的图片加载工具。

Volley提供的功能



  • JSON,图像等的异步下载;
  • 网络请求的排序(scheduling)
  • 网络请求的优先级处理
  • 缓存
  • 多级别取消请求
  • 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)

Volley优缺点


优点



  • 非常适合进行数据量不大,但通信频繁的网络操作
  • 可直接在主线程调用服务端并处理返回结果
  • 可以取消请求,容易扩展,面向接口编程
  • 网络请求线程NetworkDispatcher默认开启了4个,可以优化,通过手机CPU数量
  • 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
  • 通信更快、更稳定、更简单

缺点



  • 使用的是HttpClient的,HttpURLConnection类
  • 6.0不支持的HttpClient了,如果想支持得添加org.apache.http.legacy.jar
  • 对大文件下载Volley的表现非常糟糕
  • 只支持HTTP请求
  • 图片加载性能一般
  • 不适合进行大数据的上传和下载
  • 不能下载文件:这也是它最致命的地方

为什么使用Volley:



  • 高效的的Get/Post方式的数据请求交互
  • 网络图片的加载和缓存
  • 谷歌官方推出
  • 性能稳定和强劲

5、okhttp


okhttp简介


一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso),用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)


okhttp优势



  • 支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。),可以合并多个到同一个主机的请求
  • 允许连接到同一个主机地址的所有请求,提高请求效率
  • socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,减少了请求延迟,共享Socket,减少对服务器的请求次数
  • 基于Headers的缓存策略减少重复的网络请求。
  • 缓存响应数据来减少重复的网络请求
  • 减少了对数据流量的消耗
  • 自动处理GZip压缩
  • OkHttp使用Okio来大大简化数据的访问与存储,Okio是一个增强 java.io 和 java.nio的库。
  • OkHttp还处理了代理服务器问题和SSL握手失败问题。

okhttp流程图


\


okhttp功能



  • PUT,DELETE,POST,GET等请求
  • 基于Http的文件上传
  • 文件的上传下载
  • 上传下载的进度回调
  • 加载图片(内部会图片大小自动压缩)
  • 支持请求回调,直接返回对象、对象集合
  • 支持session的保持
  • 支持自签名网站https的访问,提供方法设置下证书就行
  • 支持取消某个请求

6、Retrofit


Retrofit简介


Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,主要作者是Android大神JakeWharton


Retrofit特性



  • 将rest API封装为java接口,我们根据业务需求来进行接口的封装,实际开发可能会封装多个不同的java接口以满足业务需求。(注意:这里会用到Retrofit的注解:比如get,post)
  • 使用Retrofit提供的封装方法将我们的生成我们接口的实现类,这个真的很赞,不用我们自己实现,通过注解Retrofit全部帮我们自动生成好了。
  • 调用我们实现类对象的接口方法。

为什么要用Retrofit




  • 在处理HTTP请求的时候,因为不同场景或者边界情况等比较难处理。你需要考虑网络状态,需要在请求失败后重试,需要处理HTTPS等问题,二这些事情让你很苦恼,而Retrofit可以将你从这些头疼的事情中解放出来。




  • 当然你也可以选择android-async-http和Volley,但为什么选择Retrofit?首先效率高,其次Retrofit强大且配置灵活,其次是和OkHttp无缝衔接。




  • 在Retrofit2之前,OkHttp是一个可选的客户端。Retrofit2中,Retrofit与OkHttp强耦合,使得更好地利用OkHttp,包括使用OkHttp解决一些棘手的问题。




Retrofit流程图


\


Retrofit优缺点


优点:



  • 可以配置不同HTTP client来实现网络请求,如okhttp、httpclient等
  • 请求的方法参数注解都可以定制
  • 支持同步、异步和RxJava
  • 超级解耦
  • 可以配置不同的反序列化工具来解析数据,如json、xml等
  • 使用非常方便灵活
  • 框架使用了很多设计模式(感兴趣的可以看看源码学习学习)

缺点:



  • 不能接触序列化实体和响应数据
  • 执行的机制太严格
  • 使用转换器比较低效
  • 只能支持简单自定义参数类型 

作者:zhang英杰
链接:https://juejin.cn/post/7039887124014841870
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册