Okhttp 终章
终章
学习Okhttp的本意是通过这个框架去学习网络相关的知识,但学习过程中发现这个方向是错的。不知道原理,就不会知道为什么,知道调用流程并没有用处。所以应该是先学习网络相关的知识,然后再去看框架。对框架不要抠细节,而是重视设计模式,编程思想之类的。所以先暂停okhttp框架的学习。
学习
1 使用-同步
Call call=new Call(request);
Response response=call.execute();
发送请求后,会进入阻塞状态,直到收到响应。
2 使用-异步
Call call=new Call(request);
call.enqueue(new callback{})
不会阻塞,接口回调结果,callback的onresponse和onfailure都是在新的线程,即工作线程中运行。
3 dispatch 运行在主线程,作用是维护请求的状态,并维护一个线程池,用户执行请求。
4 builder 模式封装创建时使用的参数。
5 对于异步请求,使用两个队列(一个队列保存正在执行中的请求,一个队列保存等待执行的请求)和一个线程池来维护。disptach作为生产者,线程池作为消费者。
6 拦截器的通用流程:
a,发起请求前对request进行处理;
b,调用下一个拦截器获取response;
c,对response进行处理,返回给上一个拦截器。
7 RetryAndFollowUpInterceptor的流程,主要作用是重试
1 创建StreamAllocation
2 调用RealInterceptorChain的proceed进行网络请求
3 根据响应结果或异常结果判断是否需要重连
4 调用下一个拦截器对response进行出来,返回给上一个拦截器
8 RetryAndFollowUpInterceptor的作用是设置内容长度,编码方式,压缩等,添加头部信息,GizpSource
1 将用户构建好的request 转化为能够进行网络请求的request。
2 将转化后的request进行网络请求
3 将网络返回的response转化为用户可以用的response。
9 ConnectInterceptor的作用是真正发起网络请求。使用httpCodeC 来编码request,解码Response.ConnectInterceptor的流程如下:
1 弄一个RealConnection对象
2 选择不同的连接方式
3 调用CallServerInterceptor
10 CallServerInterceptor读写网络数据
11 ConnectPool 提高复用,统一管理。
12 okhttp的核心
1 call 对象,是对请求的封装
2 dispatcher 是对请求的分发
3 调用getResponseWithInterceptorChain进行链式调用。