一个最普通的调用方式client.newCall(request).execute();
调用的初始都是从OkHttpClient开始的,我决定也从这里开始,看源码先画图,先画出今天要看的源码流程图吧。
Client主要处理了一堆初始化的东西。最后都是生成一个Call来进行下一步,看下
Call接口
他的实现类RealCall重写了Call的所有的方法,而OkHttpClient重写了Call.Factory接口。
重点看下RealCall,很短,只有182行。先看下构造器。
看下他再OkHttpClient中的调用
可以看到虽然继承了Call.Factory接口,但是并没有什么操作,而是放到了newCall中来处理。
图一中的方法clone最简单,就是重新构造了一个自己的实例,request()也简单就是返回构造器传入的request。
isExecuted也很简单,只要出发了execute() or enqueue()就会标记executed = true
isCanceled() and cancel(),使用了retryAndFollowUpInterceptor来实现,这个是构造器中最后一行构建的Interceptor。记录一下,一会儿再看吧。
以上只用到了Interceptor,而request和client都没用到。
最重要的一定是execute() & enqueue(Callback)这两兄弟。
最后都是调用的Dispatcher的方法
这个Dispatcher在Client的Builder中,new出来的。
/** Running synchronous calls. Includes canceled calls that haven't finished yet. */
private final Deque<RealCall> runningSyncCalls = new ArrayDeque<>();
第一步,把这个Call加入了队列,然后调用了一个getResponseWithInterceptorChain()
就拿到了Response结果。。。怎么肥四。
是构造一个RealInterceptorChain,来处理的,这个是Interceptor.Chain的内容了,这里只是使用最核心的函数response = chain.proceed(originalRequest)这个就是结果了,可以说runningSyncCalls只是一个标记状态的作用 。
再看
runningSyncCalls and runningAsyncCalls是定义的队列
/** Running synchronous calls. Includes canceled calls that haven't finished yet. */
private final Deque<RealCall> runningSyncCalls = new ArrayDeque<>();
/** Running asynchronous calls. Includes canceled calls that haven't finished yet. */
private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>();
原来异步的操作都是再Dispatcher这个类中完成的。
入参是一个AsyncCall类,这个类是RealCall的内部类。
不用看就知道NamedRunnable是一个Runnable实现类,run()方法里调用了抽象方法execute(),再次调用这个getResponseWithInterceptorChain()函数,获取到Response结果。并且根据结果调用回调函数。
可以看到下面的逻辑都是在Interceptor这个 OkHttp中最关键的组件中。