okhttp 通过分发器、责任链模式、五大拦截器来处理
分发器
同步: execute
异步:enqueue
dispatch:
两种队列:执行队列;等待队列。
如果执行队列没满,放入执行队列,如果满了放等待队列。
对于同步请求,分发器只记录请求,用于判断IdleRunnable是否需要执行;
对于异步请求,线程池(核心线程数0,等待时间60秒,队列0 实现的无等待,最大并发)
当一个任务通过execute(Runnable)方法添加到线程池时;
线程数量小于设置的线程池核心线程数,新建线程(核心)来处理被添加的任务;
线程数量大于等于设置的线程池核心线程数,存在空闲线程,使用空闲线程执行新任务;
线程数量大于等于 设置的线程池核心线程数,不存在空闲线程,新任务被添加到等待队列;
添加成功则等待空闲线程, 添加失败:
线程数量小于最大线程数,新建线程执行新任务;
线程数量等于最大线程数,拒绝此任务。如何决定将请求放入ready还是running
当客户端最大线程数小于默认64,并且同一服务器请求小于5试,放入running;反之从ready移动running的条件是什么
每个请求执行完成就会从running移除,同时进行第一步相同逻辑的判断分发器线程池的工作行为
无等待,最大并发责任链模式
对象行为型模式,为请求创建了一个接收者对象的链,在处理请求的时候执行过滤(各司其职)。
责任链上的处理者负责处理请求,客户只需要将请求发送到责任链即可,无须关心请求的处理细节和请求的传递,所以职 责链将请求的发送者和请求的处理者解耦了。五大拦截器
1、重试拦截器在交出(交给下一个拦截器)之前,负责判断用户是否取消了请求;在获得了结果之后 ,会根据响应码判断是否需要重定向,如果满足条件那么就会重启执行所有拦截器。
2、桥接拦截器在交出之前,负责将HTTP协议必备的请求头加入其中(如:Host)并添加一些默认的 行为(如:GZIP压缩);在获得了结果后,调用保存cookie接口并解析GZIP数据。
3、缓存拦截器顾名思义,交出之前读取并判断是否使用缓存;获得结果后判断是否缓存。
4、连接拦截器在交出之前,负责找到或者新建一个连接,并获得对应的socket流;在获得结果后
不进行额外的处理。
5、请求服务器拦截器进行真正的与服务器的通信,向服务器发送数据,解析读取的响应数据。
其他:
Postmain 测接口工具
telnet API tester
ssl握手