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类看一下

OKHTTP源码解析笔记(一)_第1张图片

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本身,可以实现连点操作

OKHTTP源码解析笔记(一)_第2张图片

3、

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

OKHTTP源码解析笔记(一)_第3张图片

 RealCall.newRealCall方法

OKHTTP源码解析笔记(一)_第4张图片

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

OKHTTP源码解析笔记(一)_第5张图片

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

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

AsyncCall实际上是Runnable

OKHTTP源码解析笔记(一)_第6张图片

看一下dispatcher中的enqueue方法

OKHTTP源码解析笔记(一)_第7张图片

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

promoteAndExecute方法

OKHTTP源码解析笔记(一)_第8张图片

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

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

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

(这段代码是OHT的核心)

OKHTTP源码解析笔记(一)_第9张图片

AsyncCall继承了一个NamedRunnable 

 

OKHTTP源码解析笔记(一)_第10张图片

OKHTTP源码解析笔记(一)_第11张图片

OKHTTP源码解析笔记(一)_第12张图片

看一下拦截器

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

Response getResponseWithInterceptorChain() throws IOException {
  // Build a full stack of interceptors.
  List 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框架

 

你可能感兴趣的:(Andoid学习笔记)