天天看点

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

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

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

    6、TCP的优点:         可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。         7、TCP的缺点:         慢,效率低,占用系统资源高,易被攻击 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的保持 

流程图

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

功能 •     一般的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解决一些棘手的问题。 流程图

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

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