okhttp

106 阅读5分钟

okhttp

blog.csdn.net/lcj908692/a…

分发器:

image.png

什么时候从Ready移动到Running?

image.png

每完成一次请求,都会从ready里面去一个放到running里面

线程池:

参数:

核心线程数: 一直维护的状态,一直处于活跃的状态,不会消亡 最大线程数: 同时执行的最大线程数 闲置时间: 超过了核心线程数的线程空闲了一定时间后会被回收 任务队列: readyAsyncCalls(等待的任务队列),runningAsyncCalls(正在请求的任务队列) 线程池流程: 当一个任务通过execute(Runnable)方法添加到线程池时,先会判断当前的核心线程是否小于核心线程数(CorePoolSize),如果小于那么会新建线程来处理任务,如果线程数大于corePoolSize,那么新任务被添加到等待队列里去,如果添加失败,会判断当前线程是否小于最大线程数(maxmumPoolSize),如果小于那么会新建线程来执行,如果等于最大线程数,那么使用RejectedExecutionHandle拒绝策略( 抛出异常 )

线程池队列排序机制: 如果使用的是ArrayBlockKingQueue或者LinkedBlockQueue,这两个队列需要指定容量,比如指定容量为1,那么如果当前有一个任务1进来,先添加到runningAsyncCalls队列里去,并且到线程池申请一个线程来执行,如果这个线程在执行时,又有一个任务2进来,那么会先添加到任务队列里去,此时又有一个任务3进来,那么他还是先去往队列里面放,但是发现队列容量已经满了,那么此时他会判断当前线程池里的线程有没有超过最大容量,如果没有超过那么会在线程池里开辟一个线程来执行这个任务,那第一个放在任务队列里的线程什么时候执行呢?就是有空闲线程时会执行,比如说任务1或者任务3的线程执行完了,那么就会把任务2拿出来放到此线程执行,如果使用的任务队列是SynchronousQueue(见上),这就是线程池队列排序机制

image.png

blog.csdn.net/lcj908692/a…

拦截器:

拦截器采用的是责任链模式: 真正的网络请求都是通过拦截器链来实现的,通过依次执行拦截器链上的不同功能的拦截器来完成数据响应 RetryAndFollowUpInterceptor(重定向拦截器) 1.创建StreamAllocation对象,建立执行http请求所需要的所有的网络请求组件,他的作用是用来分配stream 2.调用RealInterceptorChain.proceed()进行网络请求 3.根据异常或响应结果判断是否进行重新请求(最多只能重连20次) 4.调用下一个拦截器,对response进行处理,返回给上一个拦截器 BridgeIntercepotor(桥接拦截器) 补齐用户创建请求中缺失的请求头部信息,成为可以发送网络请求的request, 比如说设置了gZip,那么就是说可以支持服务器返回的response可以压缩,那我这个拦截器就可以解压处理,起到转换的作用 CacheInterceptor(缓存拦截器) 缓存机制是DiskLruCache,判断该请求是否有缓存,如果有直接取出,返回对应的resporse,不用继续在执行下去 ConnectInterceptor(网络连接拦截器) 作用:打开与服务器的链接,正式开启okhttp网络请求, 将创建用于网络IO的RealConnection对象以及与服务器交互最为关键的httpCodec等对象传递给后面的拦截器,httpCodec封装了编码request和解码response的对象,RealConnection用来进行实际的网络传输的对象 CallServerInterceptor(请求服务器) 用于将http请求写入到网络流当中,还可以从网络流当中读取服务端返回给客户的数据,负责完成最终的请求

自定义拦截器: addInterceptor:会在整个链条的前面 addnetworkinterceptor:会在链条的末尾,真正发起请求之前

image.png

自定义拦截器: addInterceptor:会在整个链条的前面 addnetworkinterceptor:会在链条的末尾,真正发起请求之前

image.png

连接池

三次握手于四次挥手: image.png socket连接池复用: image.png

image.png

Retofit

image.png

image.png

retofit请求前对okhttp封装,配置网络请求头等,请求后封装线程切换 retofit有三类注解,分别为8种请求方法(@GET @POST),3种请求标记(@FromUiEncoded(from表单)),11种请求参数(@Field @Part @Query),三类总计22中

基本使用:
第一步、通过Retrofit的builder模式创建一个retrofit对象,可以在builder里面设置okhttpclient、baseurl、callAdapterFactroy、addConverterFactory等信息。 第二步、通过得到的retrofit对象加工要请求的接口,得到一个接口对象。 第三步、通过这个接口对象,调用接口里面的方法得到一个网络工作对象。 第四步、通过这个网络工作对象调用enqueue方法或者execute方法发起请求并且回调回请求的结果。

retrofit解决的问题:
1、请求数据(请求行、请求头、请求体)的封装。
2、生成请求对象发起请求。
3、响应数据的封装(响应行、响应头、响应体)。

retrofit原理分析。
ServiceMethod 算是对请求数据的整体封装
动态代理首先会为每一方法生成一个ServiceMethod对象,存入缓存中,这个对象包含来网络请求所用到的一切,请求方法、请求的连接、请求头、callAdapter的适配器、convertor等信息。 调用toRequest方法
调用toRequest方法,帮助我们生成okhttp3发起网络请求所需要的Request对象。