Android面试---OkHttp原理

        okHttp原理主要是通过5个拦截器和3个双端队列(2个异步队列,1个同步队列)工作。内部实现通过一个责任链模式完成,将网络请求的各个阶段封装到各个链条中,从而实现各层的解耦。

        OkHttp底层是通过Socket发送Http请求与接收响应,但是OkHttp实现了连接池的概念,即对于同一主机的多个请求,可以公用一个Socket连接,而不是每次发送完Http请求就关闭底层的Socket。而OkHttp对Socket的读写操作使用的OkIo库进行了一层封装。

执行流程

1.建出OkHttpClient对象,通过newCall方法获得RealCall请求对象

2.通过RealCall发起同步或异步请求,线程分发器dispatcher来决定异步还是同步请求

3.同步请求时将请求加入到同步队列中依次执行,阻塞UI线程需要开启子线程执行

4.异步请求时创建线程池,判断请求队列是否大于最大请求队列64,请求主机数是否大于5,如果大于请求添加到异步等待队列中,否则添加到异步执行队列,并执行任务.

OkHttp网络缓存如何实现?

OKHttp 默认只支持 get 请求的缓存。

1.第一次拿到响应后根据头信息决定是否缓存

2.下次请求时判断是否存在本地缓存,是否需要使用对比缓存、封装请求头信息等等

3.如果缓存失效或者需要对比缓存则发出网络请求,否则使用本地缓存

OkHttp网络是怎么实现复用的?

HttpEngine在发起请求之前,会先调用nextConnection()来获取一个Connection对象,如果可以从connectionPool连接池中获取一个connection对象,就不新建,如果无法获取就新建一个connection对象。

Dispatcher的功能是什么?

主要是维护任务队列的作用,负责将每一次请求进行分发,压栈到自己的线程池,并通过调用者自己不同的方式进行异步和同步处理。

OkHttp 设置了默认的最大并发请求量 maxRequests = 64 和单个 Host 主机支持的最大并发量 maxRequestsPerHost = 5

Okhttp 拦截器的作用是什么?

1.应用拦截器

添加自定义header、通用参数、参数加密、网关接入等。

  • RetryAndFollowUpInterceptor 处理错误重试和重定向

  • BridgeInterceptor 应用层和网络层的桥接拦截器,主要工作是为请求添加cookie、添加固定的header,比如Host、Content-Length、Content-Type、User-Agent等等,然后保存响应结果的cookie,如果响应使用gzip压缩过,则还需要进行解压。

  • CacheInterceptor 缓存拦截器,如果命中缓存则不会发起网络请求。

  • ConnectInterceptor 连接拦截器,内部会维护一个连接池,负责连接复用、创建连接(三次握手等等)、释放连接以及创建连接上的socket流。

网络拦截器

用户自定义拦截器,通常用于监控网络层的数据传输。

  • CallServerInterceptor 请求拦截器,在前置准备工作完成后,真正发起了网络请求。

OkHttp有哪些优势?

1.支持http2,对一台机器的所有请求共享一个Socket

2.内置连接池,支持连接复用,减少延迟

3.支持透明的gzip压缩响应体

4.响应缓存可以完全避免网络重复请求

5.请求失败时自动重试主机的其他IP,自动重定向

6.丰富的Api,可扩展性好。

OkHttp用了哪些设计模式?

1.构造者模式   OkhttpClient,Request等对象的创建

2.工厂模式  Call接口中勇哥内部工厂接口

3.单例模式   Platform类

4.策略模式  缓存拦截器选择缓存数据还是访问网络

5.责任链模式  拦截器的链式调用

6.享元模式  Dispatcher 的线程池中,不限量的线程池实现了对象复用

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值