okhttp是Square公司开源的轻量级网络请求框架
如何进行同步的get请求:
首先,会生成一个OkHttpClient的对象。这个OkHttpClient对象有两种创建方式,一种是直接new,还有一种是通过建造者build模式来添加其他属性的操作,OkHttp内部为我们制造了很多操作,它在默认的构造函数当中,赋值了很多参数的默认值。
第二步生成一个Request对象,我们知道每一个http请求都包含一个url,一个get或post方法,还有包括http头,同时一个请求还包含一个特定内容类型的body数据部分
第三创建Response对象,响应就是对我们Request的一个回复,包含状态吗,http头和主体部分
client.newCall(request).execute();是我们同步请求比较关键的代码,前面定义的请求对象Request,Response,那么我们要生成一个call对象,通过call对象来操作请求,这个call对象在我们http请求中表示一个被执行的请求,同时这个call是可以被取消的。同步请求就要调用execute()这个方法。
看一下execute()方法的内部实现:
call是一个接口,这个抽象方法execute()我们要看他的实现类RealCall来完成具体的请求工作,看一下是怎么做的:
这就是同步请求方法在RealCall中的实现。
首先有个标志位executed,如果这个标志位executed设为true,就说明这个call请求已经被执行了,这时候如果再次调用就会抛出异常,这也就说明每一个call请求只能被执行一次,然后会打印一些异常信息等等,会开启一个监听事件。
同步请求最关键最重要的两行代码在76,77行:
首先会调用clent.dispatcher()这个方法,这个方法就是获取调度器的一个对象dispatcher, 在前面okhttp构造函数里就默认给dispatcher赋值了。
然后看一下executed是怎么做的:
他其实就是在一个双向队列当中去存放同步请求,而这个双向队列在我们新创的同步请求就会把它放到队列当中让他去执行,也是一个顺序执行的过程。将我们同步的网络请求添加到同步的请求队列当中,但是如果不进行call管理的话,随着请求越来越多,比如说有一百个一千个,那么对调度器dispatcher负荷也是越来越大的。
okhttp给我们提供了两种请求方式,一种是阻塞式的请求,另一种是异步的非阻塞式请求,不管是同步也好,异步也好,都会调用getResponseWithInterceptorChain()这个方法,这个方法就是okhttp中一个拦截器链的作用,在okhttp中拦截器有一个非常强大的机制,他可以监听,重写,重试我们的网络请求,同时这个拦截器链包含很多拦截器还有不同的作用,在每一个拦截器内部都会调用下一个拦截器的方法,这样就把整个不同的拦截器变成了一个闭环的拦截器链,所以说不管同步也好异步也好都会调用getResponseWithInterceptorChain()来完成里面的操作,实现遍历循环。
最终会调用finished这个方法,就是说执行完请求之后要从dispatcher调度器之中移除,然后返回。
这就是okhttp同步请求的一个流程。最后简单总结一下:
1.生成了一个OkHttpClient对象
这个OkHttpClient中包含了很多对象,然后他有很多其他的属性,可以在构造函数中去给他赋值;
2.创建request对象和Response对象
就对应我们OkHttp请求和响应
3.通过Call对象来操作请求
call是一个借口,要通过RealCall来完成具体的同步请求工作
4.RealCall
一个call只能被执行一次 ,如果已经执行过了,再次执行就会抛出异常
okhttp请求中的调度器会被添加到一个队列当中
okhttp会通过过拦截器链来完成实际的网络请求工作
5.执行完毕之后将同步请求从Dispatcher中移除
为了将我们的Dispatcher负荷降低,会将同步请求从Dispather中移除。
网友评论