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

目录

        一:HTTP,TCP,UDP,Socket

            1、TCP   HTTP   UDP三者的关系

              2、TCP简介和特点

              2、TCP简介和特点

              3、UDP简介和特点

              4、HTTP简介和特点

              5、Socket简介和优缺点

        二:HttpURLConnection和httpclient

            1、HttpURLConnection简介

              2、httpclient简介

        三:android常用网络框架

            1、Android-async-http 简介

              2、android-afinal框架简介和特点

              2、android-afinal框架简介和特点

              3、android-xutils框架简介和特点

              4、android-Volley框架简介和特点

              5、android-OkHttp框架简介和特点

              6、android-Retrofit框架简介和特点


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

  • TCP简要介绍

    1、TCP   HTTP   UDP三者的关系:

        (1)TCP/IP是个协议组,可分为四个层次:网络接口层、网络层、传输层和应用层。

        (2)在网络层有:IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。

        (3)在传输层中有:TCP协议与UDP协议。 

        (4)在应用层有:FTP、HTTP、TELNET、SMTP、DNS等协议。 

        (5)因此,HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。

    2、TCP简要介绍:
        TCP是面向连接的、传输可靠(保证数据正确性且保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
    3TCP三次握手:
建立一个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。

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

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

    6TCP的优点:
        可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。
   
    7TCP的缺点:
        慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

3、UDP:
面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。
UDP的优点: 快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击…… UDP的
UDP缺点:不可靠,不稳定,因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

4、 http
HTTP协议即超文本传送协议(HypertextTransfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
特点
  HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接,从建立连接到关闭连接的过程称为“一次连接”,因此HTTP连接是一种“短连接”
  1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
  2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
  
HTTP是基于客户端/服务端(C/S)的架构模型
  客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

HTTP优点:
(1)基于应用级的接口使用方便
(2)程序员开发水平要求不高,容错性强
HTTP缺点:
(1)传输速度慢,数据包大(Http协议中包含辅助应用信息)
(2)如实时交互,服务器性能压力大。
(3)数据传输安全性差

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

Socket 优点:
 (1)  传输数据为字节级,传输数据可自定义,数据量小(对于手机应用讲:费用低)
 (2)传输数据时间短,性能高
 (3)适合于客户端和服务器端之间信息实时交互
 (4)可以加密,数据安全性强
Socket缺点:
(1)需对传输的数据进行解析,转化成应用级的数据
(2)对开发人员的开发水平要求高
(3)相对于Http协议传输,增加了开发量

二:HttpURLConnection和httpclient

在Android开发中网络请求是最常用的操作之一, Android SDK中对HTTP(超文本传输协议)也提供了很好的支持,这里包括两种接口: 
1、标准Java接口(java.NET) —-HttpURLConnection,可以实现简单的基于URL请求、响应功能; 
2、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 是一个强大的网络请求库,这个网络请求库是基于 Apache HttpClient 库之上的一个异步网络请求处理库,网络处理均基于 Android 的非 UI 线程,通过回调方法处理请求结果。 
android-async-http 是一个强大的第三方开源网络请求库。可惜的是 Android 6.0 (api 23) SDK,不再提供 org.apache.http.* (只保留几个类)。
优点: 
(1) 在匿名回调中处理请求结果 
(2) 在 UI 线程外进行 http 请求 
(3) 文件断点上传 
(4) 智能重试 
(5) 默认 gzip 压缩 
(6) 支持解析成 Json 格式 
(7) 可将 Cookies 持久化到 SharedPreference


2、afinal
afinal是一个开源的android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少。
简介
在android应用开发中,通过afinal的ioc框架,诸如ui绑定,事件绑定,通过注解可以自动绑定。通过afinal的orm框架,无需任何配置信息,一行代码就可以对android的sqlite数据库进行增删改查操作。同时,afinal内嵌了finalHttp等简单易用的工具,可以轻松的对http请求进行操作。
主要组件
     FinalHttp:用于请求http数据,直接ajax方式请求,文件上传, 断点续传下载文件等
  FinalBitmap:用于显示bitmap图片,而无需考虑线程并发和oom等问题。
  FinalActivity:完全可以通过注解方式绑定控件和事件,无需编写代码。
  FinalDb:android中sqlite的orm框架,一行代码搞定增删改查。
特点
     设计简单小巧灵活
      orm零配置,但可以配置,可以通过灵活的注解配置达到更加强大的功能
     数据库查询支持DbModel,可以轻松的进行各种复杂的查询
     android的ui和事件绑定完全通过注解的方式,无需编写一行代码
     http请求支持ajax方式请求
     体积小(不到100KB),不依赖第三方jar包

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

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


3、xUtils简介
xUtils是基于Afinal开发的目前功能比较完善的一个Android开源框架,最近又发布了xUtil3.0,在增加新功能的同时又提高了框架的性能,下面来看看官方(https://github.com/wyouflf/xUtils3)对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主要有四大模块:
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约束等(需要混淆的时候请注解表名和列名);
  • 支持绑定外键,保存实体时外键关联实体自动保存或更新;
  • 自动加载外键关联实体,支持延时加载;
  • 支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。

4、Volley框架
在2013年Google I/O大会上推出了一个新的网络通信框架Volley。Volley既可以访问网络取得数据,也可以加载图片,并且在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。在使用Volley前请下载Volley库并放在libs目录下并add到工程中。
Volley的主要特性
(1). 扩展性强。Volley 中大多是基于接口的设计,可配置性强。
(2). 一定程度符合 Http 规范,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的处理,请求头的处理,缓存机制的支持等。并支持重试及优先级定义。
(3). 默认 Android2.3 及以上基于 HttpURLConnection,2.3 以下基于 HttpClient 实现,这两者的区别及优劣在4.2.1 Volley中具体介绍。
(4). 提供简便的图片加载工具。
1.2. Volley提供的功能
简单来说,它提供了如下的便利功能:
  • JSON,图像等的异步下载;
  • 网络请求的排序(scheduling)
  • 网络请求的优先级处理
  • 缓存
  • 多级别取消请求
  • 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)
Volley的优点
  • 非常适合进行数据量不大,但通信频繁的网络操作
  • 可直接在主线程调用服务端并处理返回结果
  • 可以取消请求,容易扩展,面向接口编程
  • 网络请求线程NetworkDispatcher默认开启了4个,可以优化,通过手机CPU数量
  • 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
  •  通信更快、更稳定、更简单
Volley的缺点
  • 使用的是HttpClient的,HttpURLConnection类
  • 6.0不支持的HttpClient了,如果想支持得添加org.apache.http.legacy.jar
  • 对大文件下载Volley的表现非常糟糕
  • 只支持HTTP请求
  • 图片加载性能一般
  • 不适合进行大数据的上传和下载
  • 不能下载文件:这也是它最致命的地方
为什么使用Volley:
Ø  高效的的Get/Post方式的数据请求交互
Ø  网络图片的加载和缓存
Ø  谷歌官方推出
Ø  性能稳定和强劲

5、okhttp
android网络框架之OKhttp 
一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso) 
用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,现在已经打不出来)
优势
1.支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。)
2.允许连接到同一个主机地址的所有请求,提高请求效率 
3.socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,减少了请求延迟,共享Socket,减少对服务器的请求次数 
4. 基于Headers的缓存策略减少重复的网络请求。
5.缓存响应数据来减少重复的网络请求 
6.减少了对数据流量的消耗 
7.自动处理GZip压缩 

OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和HTTP缓存。
支持SPDY,可以合并多个到同一个主机的请求
OkHttp实现的诸多技术如:连接池,gziping,缓存等就知道网络相关的操作是多么复杂了。
OkHttp扮演着传输层的角色。
OkHttp使用Okio来大大简化数据的访问与存储,Okio是一个增强 java.io 和 java.nio的库。
OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP。
OkHttp还处理了代理服务器问题和SSL握手失败问题。
OkHttp是一个Java的HTTP+SPDY客户端开发包,同时也支持Android。需要Android 2.3以上
OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和 HTTP 缓存。
默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题。
如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求。
从Android4.4开始HttpURLConnection的底层实现采用的是okHttp 
    缓存响应避免重复的网络请求

  1. PUT,DELETE,POST,GET等请求
  2. 文件的上传下载 
  3. 加载图片(内部会图片大小自动压缩) 
  4. 支持请求回调,直接返回对象、对象集合 
  5. 支持session的保持 

流程图

功能
•     一般的get请求
•     一般的post请求
•     基于Http的文件上传
•     文件下载
•     上传下载的进度回调
•     加载图片
•     支持请求回调,直接返回对象、对象集合
•     支持session的保持
•     支持自签名网站https的访问,提供方法设置下证书就行
•     支持取消某个请求

6、Retrofit
Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,其主要作者是Android大神JakeWharton
Retrofit特性
  1. 将rest API封装为java接口,我们根据业务需求来进行接口的封装,实际开发可能会封装多个不同的java接口以满足业务需求。(注意:这里会用到Retrofit的注解:比如get,post)
  2. 使用Retrofit提供的封装方法将我们的生成我们接口的实现类,这个真的很赞,不用我们自己实现,通过注解Retrofit全部帮我们自动生成好了。
  3. 调用我们实现类对象的接口方法。
这样写都太抽象了,看一段代码:
四、为什么要用Retrofit
1、咱们一起来看下Retrofit的优点:
  • 请求的方法参数注解可以定制
  • 支持同步、异步和RxJava
  • 超级解耦(我最爱)
  • 可以配置不同的反序列化工具来解析数据,如json、xml等
2、为什么使用Retrofit?
在处理HTTP请求的时候,因为不同场景或者边界情况等比较难处理。你需要考虑网络状态,需要在请求失败后重试,需要处理HTTPS等问题,二这些事情让你很苦恼,而Retrofit可以将你从这些头疼的事情中解放出来。
当然你也可以选择android-async-http和Volley,但为什么选择Retrofit?首先效率高,其次Retrofit强大且配置灵活,第三和OkHttp无缝衔接,第四Jack Wharton主导的(你懂的)。
在Retrofit2之前,OkHttp是一个可选的客户端。二Retrofit2中,Retrofit与OkHttp强耦合,使得更好地利用OkHttp,包括使用OkHttp解决一些棘手的问题。
流程图

优点: 
可以配置不同HTTP client来实现网络请求,如okhttp、httpclient等 
请求的方法参数注解都可以定制 
支持同步、异步和RxJava 
超级解耦 
可以配置不同的反序列化工具来解析数据,如json、xml等 
使用非常方便灵活 
框架使用了很多设计模式(感兴趣的可以看看源码学习学习) 
缺点: 
不能接触序列化实体和响应数据 
执行的机制太严格 
使用转换器比较低效 
只能支持简单自定义参数类型 

    

猜你喜欢

转载自blog.csdn.net/jie1123161402/article/details/80535659