Android OKhttp原来是切面编程

一、Okhttp三步走

1、创建OKhttpClient和Request

2、创建Call

3、调用Call的请求方法

二、OkHttp的重要类

Dispatcher:

用来分配同步和异步的请求。里面维护了一个线程池用来异步请求。符合生产者消费者模型设计。

同步请求直接添加到同步执行队列中,然后调用。

异步请求分两个情况,如果执行线程小于64且host小于5,则直接加入异步执行队列,否则进入异步就绪队列。然后调用。

Interceptor:

拦截器链。用来在网络请求前包装请求头,请求体,判断是否使用缓存,复用connection等,也负责在网络返回后进行解压,缓存,重试等一系列操作。

拦截器其实一种切面编程,每一个拦截器针对下一个拦截器进行切面编程。总体上拦截器对网络请求本身进行了切面编程。这样做可以减少判断和解耦代码职责。

三、Okhttp具体都有哪些优化

1、Connection连接池

http请求每次都会经历三次握手才能建立连接,okhttp针对这一点进行了优化建立了一个connectionpoll的连接池,里面维护着我们需要连接的connection,5个空闲的连接。这样就实现了减少握手次数的作用。

2、请求线程池

okhttp针对异步请求,建立了一个线程池来维护请求。核心线程数为0,这也就意味着okhttp的线程池所有线程都会在闲置时进行回收。最大执行任务数并没有让线程池进行维护,而是自己建立了一个执行队列和就绪队列来进行维护。

3、支持GZIP来减少数据流量

这个由BridgeInterceptor来进行切面编程实现,对CacheInterceptor进行执行完毕编程,进行无缝解压行为。

4、缓存响应数据来减少重复的网络请求

这个有CacheInterceptor进行实现,不管是否使用缓存,前切面都会去判断是否有缓存,有就返回没有就进行网络请求。而是否缓存则是后切面进行实现。

需要注意的是,OKHttp只对GET方法进行缓存。

为什么只缓存GET不缓存POST或者其他呢?因为约定上,GET方法请求到的东西是不变的,而POST会频繁修改参数和提交表单等操作,不符合编程约定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章