Okhttp

优势:

1、支持复用,网络请求效率高。因为它网络请求的时候是封装了线程池和队列(等待队列和执行队列)(作用:维护线程任务),线程池的作用就是提高我们的工作效率,最大限量是64,线程池的原理就是。。。底层采用了Socket+okio(okio和普通io的区别),

okio是一个增强java.io和java.nio的库

2、使用方便,因为封装的比较好,我们通过构造者设计模式来创建请求头和请求体,通过okHttp.builder()关联

3、拓展性强,它可以自定义线程池分发器

4、可以通过配置拦截器来配置网络请求的过程。通过拦截器做了公共请求头和请求参数的处理,还有登陆的cookie和token,如果不通过拦截器处理,它不能统一处理。

拦截器原理:通过责任链设计模式(事件分发也是责任链设计模式),ok本省自带的拦截器有4种,剩下的可以自定义拦截器。

5、支持socket和websocket。

Ok本身没有问题,只不过它使用的时候得注意一些问题!

 

OkHttp中用到拦截器:

1.RetryAndFollowUpInterceptor (重定向拦截器)

发起网络请求,如果网络请求出现异常会根据响应码进行重定向和重试,重定向时如果地址不一致会释放连接。如果没有异常则调起下一个拦截器chain.proceed(request)

2.BridgeInterceptor (桥接拦截器)

职责1:将构建的 Request 请求转换为能够进行网络访问的请求,添加用于网络请求的请求头信息

职责2:根据响应是否需要对Response 进行 gzip 压缩,具体是用 Okio 的库对 Response 进行压缩,并返回 Response   

3.CacheInterceptor (缓存拦截器)

1.根据request来判断cache中是否有缓存的response,如果有,得到response,然后进行判断response是否有效,没有将cacheCandate赋值为空。

2.根据request判断缓存的策略,是否要使用了网络,缓存,或两者都使用调用下一个拦截器,决定从网络上来得到response,如果本地已经存在cacheResponse,那么让它和网络得到的networkResponse做比较,决定是否来更新缓存的cacheResponse,缓存未经缓存过的response。

4.ConnectInterceptor (连接拦截器)

TCP每次请求都建立连接会极大地影响效率。连接拦截器内部维护了可以重复使用的 Socket 连接池,减少握手次数,加快请求响应。

5.网络拦截器(NetworkInterceptor)

在请求发起之前,可以添加自定义拦截器

6.CallServerInterceptor(读写拦截器)

负责实现网络IO,所有拦截器都要依赖它才能拿到响应数据。

 

 

OkHttp注意事项:

1、注意回调结果的处理。回调结果在子线程,处理在主线程。并且输入流之允许读取一次。

2、手动去映射实体类。

OkHttp使用弊端:

虽然使用的时候已经很简单了,但是相对于来说使用过程中还是有弊端,比如说请求体和请求过程耦合,请求过程的参数需要手动拼接。

 

OkHttp原理:

    OkHttp是一个精巧的网络请求库,支持http2,所有请求共享同一个socket,内置连接池,支持连接复用,减少延迟,支持透明的gzip压缩响应体。通过缓存避免重复的请求,请求失败时自动重试主机的其他ip,自动重定向,使用方便。

OkHttp3最底层是Socket,通过Platform的Class.forName()反射获得当前使用的socket。在connection接口中封装创建socket对象,通过RealConnection来实现。数据的输入输出流操作通过stream接口来实现,根据不同的网络协议,有Http1xStream和Http2xStream两个实现类

由于创建网络连接的时间较久(如果是HTTP的话,需要进行三次握手),而请求经常是频繁的碎片化的,为了提高网络连接的效率,实现了网络连接复用。

okhttp中用到的设计模式

单例模式:OkHttpClient拥有自己独有的线程池和连接池。一个对象即可, 多个容易导致内存爆掉

外观模式:OKHttpClient 里面组合了很多的类对象。此模式是将OKHttp的很多功能模块,全部包装进这个类中,让这个类单独提供对外的API

Builder模式:使用多个简单的对象一步一步构建成一个复杂的对象

工厂模式:Call接口提供了内部接口Factory,将对象的创建放到到该工厂类的子类中进行,从而实现动态的配置。

工厂方法模式。在创建对象时不会暴露创建逻辑,通过使用一个共同的接口来指向新创建的对象

享元模式:在Dispatcher的线程池中,所用到了享元模式,一个不限容量的线程池 , 线程空闲时存活时间为 60 秒。(帮助理解,可以不写:线程池实现了对象复用,降低线程创建开销,从设计模式上来讲,使用了享元模式。享元模式:尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象,主要用于减少创建对象的数量,以减少内存占用和提高性能)

责任链模式:在okhttp中的拦截器模块,执行过程用到。(帮助理解,可以不写: OkHttp3 的拦截器链中, 内置了5个默认的拦截器,分别用于重试、请求对象转换、缓存、链接、网络读写(责任链模式为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。)

策略模式 :CacheInterceptor 实现了数据的选择策略, 来自网络还是来自本地。(帮助理解,可以不写: 这个场景也是比较契合策略模式场景, CacheInterceptor 需要一个策略提供者提供它一个策略, CacheInterceptor 根据这个策略去选择走网络数据还是本地缓存。(策略模式一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值