开源框架剖析-网络请求OkHttp

okhttp

Posted by ZYT on March 5, 2020

开源框架剖析-网络请求OkHttp

使用流程

    OkHttpClient client = new OkHttpClient.Builder().build();
    Request request = new Request.Builder().build();
    Call call = client.newCall(request);
    call.execute()/enqueue(callback)

1,创建OkhttpClient和Request对象 均使用了Builder模式

2,将Request封装成Call对象

3,同步调用Call.execute(),同步调用Call.enqueue()

核心类

Dispatcher

维护同步、异步请求状态,维护一个线程池

readyAsyncCalls就绪等待异步请求

runningAsyncCalls正在执行的任务请求(包含已经取消但没有执行完的)

runningSyncCalls同步请求队列

executorService线程池

异步请求为什么需要两个队列?生产消费模型

Dispatcher的finish方法在执行的finally中执行,主要做3件事 1)队列移除当前请求,2)调整请求任务队列,3)重新计算正在进行线程数量

Okhttp拦截器链getResponseWithInterceptorChain

可以实现网络监听、请求重写及相应重写、请求失败重试等功能

实现步骤:

1,创建一些列拦截器,放入一个拦截器list中

2,创建一个拦截器链对象RealInterceptorChain,并执行拦截器的proceed方法(核心创建下一个拦截器链,内部会执行下一个拦截器的interceptor方法)

内部提供拦截器有:
1,RetryAndFollowUpInterceptor
重试和失败重定向

步骤:

创建StreanAllocation对象

调用RealInterceptorChain.proceed()进行网络请求

根据异常结果或者相应结果判断是否需要进行重新请求

调用下一个拦截器,对response进行处理,返回给上一个拦截器

2,BridgeInterceptor
桥接适配。内容长度、编码方式、压缩

步骤:

负责将用户构建好的Request请求转化为能够进行网络访问的请求

将这个符合网络请求的Request进行网络请求

将网络请求返回的Response转化为用户库尔用的Response

3,CacheInterceptor
缓存策略使用的Cache类的put\get方法

步骤:

取缓存,然后做判断能不能用

如果不能用调用proceed方法进入下一个拦截器的intercept方法

intercept方法返回response经一系列判断后决定要不要存入缓存

4,ConnectInterceptor
建立可靠连接

步骤:

弄一个RealConnection对象, ConnectInterceptor获取Interceptor传过来的StreanAllocation,streamAllocation.newStream()

选择不同的连接方式 streamAllocation.connection();

将上边这些参数传递给后边的拦截器

5,CallServerInterceptor
负责将请求写进网络io流,同时读取返回的io