OKHttp源码分析 part 1

一个最普通的调用方式client.newCall(request).execute();
调用的初始都是从OkHttpClient开始的,我决定也从这里开始,看源码先画图,先画出今天要看的源码流程图吧。
在这里插入图片描述
Client主要处理了一堆初始化的东西。最后都是生成一个Call来进行下一步,看下
Call接口
图1
他的实现类RealCall重写了Call的所有的方法,而OkHttpClient重写了Call.Factory接口。

重点看下RealCall,很短,只有182行。先看下构造器。
在这里插入图片描述
看下他再OkHttpClient中的调用
图2
可以看到虽然继承了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中最关键的组件中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值