同步请求
// 构建okHttpClient,相当于请求的客户端,Builder设计模式
OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();
// 构建一个请求体,同样也是Builder设计模式
Request request = new Request.Builder().url("http://www.baidu.com").build();
// 生成一个Call对象,该对象是接口类型
Call call = okHttpClient.newCall(request);
try {
// 拿到Response
Response response = call.execute();
Log.i("TAG",response.body().string());
} catch (IOException e) {
}
以上就是一个简单的同步请求示例代码,我们来看一看要经过哪些步骤:
1. 通过Builder模式创建OkHttpClient对象和Request对象
2. 调用OkHttpClient的newCall方法,获取一个Call对象,参数是Request
3. 调用execute方法获取一个Respone
知识点:
1 Builder:是OkHttpClient一个静态内部类,在Builder的构造函数中进行了一系列的初始化操作,其中Dispatcher中文是分发器的意思,和拦截器不同的是分发器不做事件处理,只做事件流向。他负责将每一次Requst进行分发,压栈到自己的线程池,并通过调用者自己不同的方式进行异步和同步处理
2 ConnectionPool:是一个连接池对象,它可以用来管理连接对象,从它的构造方法中可以看到连接池的默认空闲连接数为5个,keepAlive时间为5分钟。
3 Request:请求体,同样也是Builder设计模式,默认get请求方式
4 Call: okhttpclient.newCall方法内部调用了RealCall的newRealCall方法,在newRealCall方法里,完成了RealCall对象的创建,并把它返回出去,Call是一个接口,RealCall是它的实现类
5 Response:第一步dispatcher 添加请求到runningSyncCalls(同步请求对执行队列)第二步 创建interceptors 集合,以此是 自定义拦截器,重试跟踪拦截器,桥接拦截器,缓存拦截器,连接拦截器,呼叫服务拦截器 做一些相应的操作 返回Response 对象 第三步 dispatcher 将call对象从同步请求消息队列中移除
异步请求
// 构建okHttpClient,相当于请求的客户端,Builder设计模式
OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();
// 构建一个请求体,同样也是Builder设计模式
Request request = new Request.Builder().url("http://www.baidu.com").build();
// 生成一个Call对象,该对象是接口类型
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
简单的看下异步请求的几个步骤:
1. 通过Builder模式创建OkHttpClient对象和Request对象
2. 调用OkHttpClient的newCall方法,获取一个Call对象,参数是Request
3. 调用call对象的enqueue()方法
步骤1和步骤2跟同步请求的步骤一致,主要看一下步骤3
知识点:异步请求和同步请求的步骤1和步骤2一致,都是在做准备工作,并没有发起请求,所以这次我们直接忽略了步骤1和步骤2的分析,直接分析步骤3的源码
-
readyAsyncCalls 是异步请求的就绪队列
-
runningAsyncCalls 是异步请求的执行队
1 调用了Dispatcher的executed方法,将当前的call请求添加到待准备消息队列中去
2 把符合条件的call请求从readyAsyncCalls提升为runningAsyncCalls
3 getResponseWithInterceptorChain()返回Response对象,然后判断retryAndFollowUpInterceptor是否取消回调CallBack接口的onFailure()或onResponse()方法,最后finally中,和同步请求的处理一样,调用了Dispatcher对象的finished()方法。
总结:异步请求中,我们先去遍历异步请求的就绪队列,并判断异步请求的执行队列的队列大小是否小于设置的最大数的时候,如果条件满足,把该请求添加到异步请求的执行队列中去,同时把该请求添加到临时的异步请求的执行队列去中。之后,遍历这个临时的异步请求的执行队列,去执行AsyncCall的execute()方法。