1.okhttp源码解析
流程详解(依赖implementation 'com.squareup.okhttp3:okhttp:3.10.0')
1.创建OkhttpClient对象(用于发送http请求和读取请求返回的数据,创建方式有两种:构建这模式和普通创建
,构建这模式可以自定义Builder,普通创建使用默认的Builder).
2.创建Call对象:一个call对象表示一次请求,每次交易请求都会产生一个新的Call对象,Call其实是一个接口,
它的实现类是RealCall对象。创建过程:通过newCall()方法返回一个RealCall对象。
3.请求交易:okhttp提供了两种请求方式:同步请求和异步请求,同步请求调用call.execute()方法,异步请
求调用call.enqueue(Callback callback)方法。
再看两个请求方式之前需要先知道okhttp中的一个重要成员Dispatcher(调度器)。
3.1.Dispatcher(调度器):Okhttp的任务调度核心类,负责管理同步和异步请求,并且在其内部还维护了一个
线程池用于执行相应的请求,同时在其内部还维护了两个任务队列:准备执行的任务队列和正在执行的任务
队列。
3.2.同步请求call.execute()
同步请求调用call.execute()方法,在其内部会调用Dispatcher的execute()方法和getResponseWithInterceptor
Chain(),通过该方法把realcall对象添加到任务队列中(runningSyncCalls.add(call)),然后不管结果如何最后
会调用Dispatcher的finished方法把该请求从任务队列中移除。
3.3.异步请求call.enqueue(Callback callback)
异步请求调用call.enqueue(Callback callback),在其内部会调用dispatcher的equeue(new AsyncCall(respon
seCallback))方法,该方法会传入一个AsyncCall对象,在dispatcher的enqueue方法内会先判断当前运行中的
请求数是否小于最大请求数默认最大请求数为64,并同时判断当前运行中的共同主机请求数是否小于设定的
最大请求数,默认同一主机的请求数量最大值为5,当两者同时成立时,会调用runningAsyncCalls.add(call)
方法(表示此次请求的call对象存在runningAsyncCalls队列中)和executorService()的execute(call)方法,反
之就会调用redyAsncCalls.add(call)(表示此次请求的call对象存在readyAsyncCalls队列中,readyAsyncCalls
表示已准备好并等待执行请求的队列,当有空闲网络请求线程时,会从该队列中取出并执行网络请求),通
过executorService.execute(call)方法将call对象传入线程池执行,通过源码可知AsyncCall是一个Runnable的
实现,用来开启一个线程,executorService是dispatcher内部维护的线程池,所以executorService.execute
(call)方法的作用是通过网络请求线程池执行该线程的run()方法调用AsyncCall的execute()方法,最后在exe
cute()方法内调用和同步请求时提到的getResponseWithInterceptorChain()方法。
3.4.getResponseWithInterceptorChain()/拦截器
这个方法是通过拦截器链对请求数据和返回数据进行处理,内部采用责任链模式,将每一个拦截器对应负
责的处理任务进行严格分配,最后将交易结果返回并回调到暴露给调用者的接口上。
根据源码可以看到,最后交给了了RealInterceptorChain(拦截器链类)这个真正的处理类,并调用
RealInterceptorChain的proceed()方法,在该方法内部会调用拦截器的intercept(next)方法,只有当前拦截器
的response返回结果时,才会执行下一个拦截器(因此得出结论:下一个拦截器依赖于当前拦截器的返回,
可以保证拦截器的依次执行。),在拦截器链中执行的结果,在同步请求中会直接在response返回,异步请
求时会把拦截器链的处理结果通过Callback的onReponse回调给用户。
这些拦截器包括:
①.用户自定义的拦截器
②.retryAndFollowUpInterceptor:重试和重定向拦截器,主要负责网络失败重连。
③.BridgeInterceptor:主要负责添加交易请求头。
④.CacheInterceptor:缓存拦截器,主要负责拦截缓存。
⑤.ConnectInterceptor:网络连接拦截器,主要负责正式开启http请求。
⑥.CallServerInterceptor:负责发送网络请求和读取网络响应