看该篇文章前首先要熟悉okHttp的使用,建议先读OkHttp的简单使用html
本文的源码解析参考连接:okhttp3总和解析缓存
由异步将请求加入调度方法开始引入正题:并发
getClient().newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { } });
/** * Prepares the {@code request} to be executed at some point in the future. */ @Override public Call newCall(Request request) { return new RealCall(this, request); }
@Override public void enqueue(Callback responseCallback) { enqueue(responseCallback, false); } void enqueue(Callback responseCallback, boolean forWebSocket) { synchronized (this) { if (executed) throw new IllegalStateException("Already Executed"); executed = true; } client.dispatcher().enqueue(new AsyncCall(responseCallback, forWebSocket)); }
由源码上的调用顺序,咱们将步骤转化为如下的几个技术点:异步
由以上的使用okhttp请求的调用代码,能够看到最终的请求时经过dispatcher来完成的。ide
Dispatcher进行线程分发,有两个方法,一个是普通的单线程,也就是线程阻塞的方式请求;另外一种就是经过队列进行并发任务的分发和回调,下面主要分析第二种:高并发
就是想到生成一个可缓存的线程池,实现高并发、低阻塞的任务调度。this
拦截器主要用来观察、修改、以及可能短路的清除输出、和响应的回来。spa
一般用来添加、移除或者转换请求或者xiangying的头部信息。好比将域名替换为ip地址,将请求头中添加host属性,也能够添加咱们应用中的一些公共参数,好比设备id、版本号等等。线程
http://www.jianshu.com/p/2710ed1e6b48 code