OKHTTP源码解析笔记(一)

OkHttpClient简称为OHC

1、OHC配置一些默认设置

//第一步获取okHttpClient对象
OkHttpClient client = new OkHttpClient.Builder()
        .cache(new Cache(getCacheDir(),10240*1024))
        .connectTimeout(20, TimeUnit.SECONDS)
        .followRedirects(true)
        .build();

builder类看一下

builer中

1、dispatcher创建了任务调度器(创建了线程池,管理所有任务,它能拿到当前请求队列有哪些)

2、Protocol 请求网络的默认版本设置为1.1,2.0

3、Dns.SYSTEM    DNS解析

4、超时处理

。。。等等一系列的设置

二、构造Request

使用建造者设计模式

//第二步构建Request对象
Request request = new Request.Builder()
        .url("http://www.baidu.com")
        .get()
        .build();

看一下这个Builder,它属于Request中的静态内部类,它返回的是Builder本身,可以实现连点操作

3、

//第三步构建Call对象
Call call = client.newCall(request);

 RealCall.newRealCall方法

 实际上就是RealCall 执行了enqueue方法

先执行一个同步方法来判断异常,client拿到了dispatcher(任务管理器),dispatcher来执行了

enqueue方法,又把我们传入进来的匿名内部类的回调接口传到AsyncCall中。

AsyncCall实际上是Runnable

看一下dispatcher中的enqueue方法

readyAsyncCalls是一个准备请求队列,把新建的Call加入到这个里,下一步执行

promoteAndExecute方法

 会遍历我们已经加入的Runnable,最后执行了asyncall.executeon这个方法

executorService是一个线程池,任务调试器把创建好的线程池传入进了AsynCall里去执行

executeOn方法,线程池又执行了当前的runnable。

(这段代码是OHT的核心)

AsyncCall继承了一个NamedRunnable 

 

看一下拦截器

 这是一个责任链式设计模式

Response getResponseWithInterceptorChain() throws IOException {
  // Build a full stack of interceptors.
  List<Interceptor> interceptors = new ArrayList<>();
  interceptors.addAll(client.interceptors());
  interceptors.add(retryAndFollowUpInterceptor); 负责错误重试和重定向
  interceptors.add(new BridgeInterceptor(client.cookieJar()));负责组装请求和解析数据 
  interceptors.add(new CacheInterceptor(client.internalCache()));负责读取缓存和更新缓存
  interceptors.add(new ConnectInterceptor(client));负责和服务器建立连接
  if (!forWebSocket) {
    interceptors.addAll(client.networkInterceptors());
  }
  interceptors.add(new CallServerInterceptor(forWebSocket));负责发送请求和接收数据

  Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
      originalRequest, this, eventListener, client.connectTimeoutMillis(),
      client.readTimeoutMillis(), client.writeTimeoutMillis());

  return chain.proceed(originalRequest);
}

 OHC的主要源码就过眼一遍啦!

整个流程就是 new HttpClient -----  创建线程池 ----创建了CallBack 并把它封装进入Runnable中---然后执行execute

(线程池去执行runnable方法)-----runnable方法中已经设置了拦截器

仿写OkHttp框架

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TouchOfSun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值