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框架