# 网络框架

# HttpClient与HttpUrlConnection

# 区别

HttpClient是Apache公司提供的库,提供高效的、最新的、功能丰富的支持HTTP协议工具包,支持HTTP协议最新的版本和建议,封装了http的请求,参数,内容体,响应等,拥有众多API。

HttpURLConnection是Sun公司提供的库,也是Java的标准类库java.net中的一员,但这个类什么都没封装,用起来很原始,若需要高级功能,则会显得不太方便,比如重访问的自定义,会话和cookie等一些高级功能。

这两种方式都支持HTTPS协议,以流的形式进行上传和下载,配置超时时间,IPV6,连接池等功能。

功能上说,HttpClient的库要丰富很多,封装了请求头、参数、内容体、响应等,包括代理、Cookie、鉴权、压缩、连接池的使用等等。但是HttpClient的高级功能的代码写起来很复杂,而HttpUrlConnection的代码对大部分工作都进行了封装,屏蔽了不需要的细节,适合直接调用。

性能上说,HttpUrlConnection支持GZip压缩、系统级连接池、缓存策略的处理等等,加快了请求的速度。

因此,在Android6.0之后,HttpClient被废弃,建议选用HttpUrlConnection。

# OkHttp

# 原理

OkHttp的执行过程

  1. 通过OkHttpClient创建一个Call,并发起同步或者异步的请求;
  2. OkHttp会通过Dispatcher线程池会对所有的RealCall(即具体实现类)进行统一管理,并通过execute()以及enqueue()方法对同步或者异步请求进行解决;
  3. execute()以及enqueue()两个方法,会最终调用RealCall的getResponseWithInterceptorChain()方法,从拦截器链中获取返回结果;
  4. 拦截器链中,包括重定向拦截器、桥接拦截器、缓存拦截器、连接拦截器、网络拦截器等依次解决,最后将结果返回给调用方。

OkHttp的底层是通过Java的Socket发送HTTP请求与接收响应的(HTTP就是基于TCP协议的),但是OkHttp实现了连接池的概念,即对于同一主机的多个请求,其实可以公用一个Socket连接,而不是每次发送完HTTP请求就关闭底层的Socket,这样就实现了连接池的概念。而OkHttp对Socket的读写操作使用的Okio库进行了一层封装。

# Retrofit

# 原理

Retrofit通过接口以及注解的方式来描述网络请求,并用动态代理的方式生成网络请求的request,然后通过client调用底层的网络框架OkHttp来发起网络请求,将返回的response通过convertrFactory转换成相应的数据model,最后通过callAdapter转化成其它的数据方式。

# 代理

静态代理类由程序员创建或工具生成代理类的源码,再编译代理类,所谓静态就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

动态代理类是程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定的。

# 静态代理

静态代理业务类只需要关注业务逻辑本身,保证了业务类的重用性。代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,需要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法,增加了代码维护的复杂度。

# 动态代理

动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler invoke)。这样,在接口方法数量比较多的时候,可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使类职责更加单一,复用性更强。

# Volley Uncompleted