• 简单说下OkHttp。

    OkHttp默认支持
    1共享一个scoket完成相同主机的请求,支持Http2.0,头部压缩、连接复用、服务端push,同一主机所有请求共用一个scoket连接;
    2.连接池,减少请求延迟(https http协议下)
    3.透明gzip压缩
    4.响应缓冲,减少不必要的网络请求。

网络请求调用流程大致是:
首先创建request对象,设置请求地址,方法,header信息,接着OkHttp调用newCall方法传入创建好的request对象,newCall返回RealCall,RealCall执行enqueue执行异步请求,同时传入回调, 请求完成拿到数据,同步请求执行execute方法并返回response对象。

  • OKHttp中线程池是怎么设置的?
    Dispatcher.ececuteService()创建了线程池。
1
2
3
4
5
6
7
public synchronized ExecutorService executorService() {
if (executorService == null) {
executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));
}
return executorService;
}

ThreadPoolExecutor参数含义:

corePoolSize:0 –核心线程数 即一直保持在线程池中的线程数,即使它们闲置也不会被回收,除非设置了核心线程数超时时间allowCoreThreadTimeOut,设置allowCoreThreadTimeOut后核心线程在闲置时达到超时时间就会被回收。
maximumPoolSize:Integer.MAX_VALUE–线程数池中允许的最大线程数;
keepAliveTime:60–线程池中非核心线程闲置等待任务时的超时时间;
unit:TimeUnit.SECONDS– keepAliveTime的时间单位;
workQueue:AsynchronousQueue –工作队列是任务在执行前的容器,任务通过execute方法提交;
threadFactory:Util.threadFactory(“OkHttp Dispatcher”, false) –该工厂在创建线程时被使用;

所以OkHttp中的线程池创建时没有核心线程,不限制线程的数量,线程在闲置60s后会被回收,那么是不是说线程池中的线程并行是不做限制的增长,显然不是,Dispatcher还维护了异步请求的两个队列(runningAsyncCalls和readyAsyncCalls),在向runningAsyncCalls队列中添加call时最大请求数是64,这样保证同一时刻最多只有64个请求正在执行,使线程池中线程的增量是可控的。另外还可以自定义线程池配置设置给Dispatcher。

  • Dispatcher(分发器)主要负责什么?
    Dispatcher内部维护一个线程池,和三个请求队列(runningAsyncCalls、readyAsyncCalls and runningSyncCalls),负责请求的执行和管理。

  • 拦截器(Interceptor)主要负责什么?拦截器的好处?
    拦截器是OkHttp中最重要的部分,它负责网络重试、重定向、网络监控、缓冲等功能。拦截器的调用流程是从getResponseWithInterceptorChain方法开始,getResponseWithInterceptorChain方法中创建ApplicatinInterceptorChain,接着调用chain.proceed(request),proceed方法中继续创建ApplicatipnInterceptorChain,将chain传入拦截器interceptor方法中,该方法中会执行chain.proceed(),接着每个拦截器依次都会被调用到,最后在CallServerIntercptor拦截器中返回请求服务器得到的response对象。拦截器调用过程中我们可以自定义应用类拦截器和网络类拦截器,应用类拦截器最先被执行,网络类拦截器会在建立连接后被执行,也就是ConnectInterceptor拦截器被调用之后。 拦截器的这种设计使复杂的网络请求操作分层完成,每一层的拦截器完成自身对请求和响应的任务(各司其职)。

  • OkHttp内置哪些拦截器,具体负责哪个任务?
    内置拦截器包括:
    RetryAndFollowupInterceptor:负责网络重试和重定向;
    BridgeInterceptor:负责将应用层码转化为网络层码,将header中缺失的网络层特有header补充完整(例如User-Agent,keep-alive);
    CacheInterceptor:管理缓冲,缓冲读取和更新;
    ConnectInterceptor:建立网络连接,是请求服务的基本;
    CallServerInterceptor:真正发送请求和获取响应数据(将请求写入IO流中,从IO流中读取响应);

  • 实际业务中用自定义拦截器可以做什么?
    自定义应用类拦截器:
    添加请求header 签名(Id 参数 md5) 版本 ;
    验签失败重试(返回内容中会有重试策略);
    自定义日志打印。

自定义网络层拦截器:
如果需要打印网络重试、重定向等信息可以使用网络

  • OkHttp中用到了哪些设计模式?
    1.建造者模式(Builder模式)适合构造函数入参多而杂的情况下使用:
    说明:使用一个Builder类一步步构建最终的对象。目标对象是由多个“配置”组合构造出来的。
    OkHttpClient、Request、Response、Headers、HttpUrl都是用了构造者模式。
    2.工厂模式:
    说明:创建目标对象不需要对对象使用者暴露创建逻辑,对外屏蔽对象具体实现,使用者只需关注其接口。
    CacheStrategy.Factory、ThreadFactory、EventListener.Factory(调用create()根据call创建EventListener)。
    3.外观模式:
    说明:统一一个类对调用者提供一系列接口,隐藏内部系统的复杂性。
    OkHttpClient类 调用者的调用接口都是通过OkHttpClient完成。
    4.责任链模式:
    说明:一个请求需要经过多个处理者进行责任处理才能完成。没有处理者都有一个特点:前一个处理者对象会持有下一个处理者对象的引用形成一条链,请求发生时,沿着这条链传递。
    拦截器链。
    5.单例模式:
    说明:自己创建自己的唯一实例。
    OkHttpClient在项目中使用需要用单例。

  • OkHttp在项目中做了哪些封装?
    OkHttpClient做了单例

感谢:
https://www.jianshu.com/p/fa0dcbfe05cd
https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html