Http库一定是两个核心,一个是IO核心,一个是http协议的封装,okhttp基于okio库封装了http协议并整合了分发器和线程池模型,是一个用起来很简单,api接口很容易理解的高效库。
首先看一段最简单的也是最常用的甚至是你可能仅仅只会用到这个的一段代码:
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://taobao.com").build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
// do something
}
}
@Override
public void onFailure(Call call, IOException e) {
// do something
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
步奏:
1. 创建一个okhttpclient
2. 创建一个request
3. 通过okhttpclient把request封装成一个call
4. 把call丢进异步执行队列,并丢进去一个callback回调方法
5. 等着执行结束或者出错,在回调里做一些事情
整个流程很清晰,很容易理解,但我们还是想知道下面是怎么实现的,好奇心作祟,ok,我们来看看这个代码中的关键部分call.enqueue的调用链:
call是接口,实现类是realcall,realcall里面有okhttpclient的实例,而okhttpclient里面有dispacher的实例,所以实际上realcall会把callback放进dispatcher里,而dispatcher里会线程池和任务队列,线程会从任务队列里取任务执行,执行是通过interceptChain的里所有拦截器去遍历执行的,最后返回response
ok说了这么多可能还是有点懵,继续上图:
- dispatcher是一个分发器,里面的任务队列存着很多任务call,每次取出一个call去执行
- interceptorChain是一个拦截器链条,可以想象成一个链表,
- interceptor是拦截器,每个拦截器都会对获取的流做一些处理,例如重试拦截器,缓存拦截器等等
- 每个拦截器处理完后会把response传递给拦截器链的下一个拦截器,直到这个链表跑完最后返给chain,然后返给callback的回调方法,这个设计和netty一样,但其实现真心没有netty写的漂亮
至于IO核心被放到client里了,下次再分解。
本文暂时没有评论,来添加一个吧(●'◡'●)