okhttp2.7.5源码 分析

Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 Apache HTTP Client,虽然两者都支持HTTPS,流的上传和下载,配置超时,IPv6和连接池,已足够满足我们各种HTTP请求的需求。但更高效的使用HTTP 可以让您的应用运行更快、更节省流量。而OkHttp库就是为此而生,okhttp底层增加了okIo,这个类库,这个类库是对java原生IO的再次封装,效率更高

  • 支持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求

  • 如果SPDY不可用,则通过连接池来减少请求延时

  • 无缝的支持GZIP来减少数据流量

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

同事还支持失败以后重新连接请求:

总体的架构设计:

okhttp同时支持异步和同步请求:

1.异步请求:Call对象负责所有的请求,

 

 /** Used by {@code Call#execute} to signal it is in-flight. */
  synchronized void executed(Call call) {
    executedCalls.add(call);
  }




执行完毕以后将这个任务从executedCalls队列里面移除,此次一个同步请求完成。


2.异步请求:在请求的时候把任务放在线程池里面,默认最大的请求数量是:maxRequests=64,但是okhttp为了提高请求采用的阻塞队列是:SynchronousQueue,其中线程核心数为0,最大线程数为:Integer.MAX_VALUE,采用SynchronousQueue这种阻塞队列。SynchronousQueue每个插入操作必须等待另一个线程的移除操作,

 同样任何一个移除操作都等 待另一个线程的插入操作。因此此队列内部其 实没有任何一个元素,
 或者说容量是0,严格说并不是一种容器。由于队列没有容量,因此不能调用peek操作,
 因为只有移除元素时才有元素。显然这是一种快 速传递元素的方式,也就是说在这种情况
 下元素总是以最快的方式从插入者(生产者)传递给移除者(消费者),这在多任务队列中
 是最快处理任务的方式。对于高 频繁请求的场景,无疑是最适合的。



然后我们看下AsyncCall,这个对象其实就是一个线程,我们看下它里面怎么写的:


在请求完成以后继续执行下一个请求,我们再去看看源码:


会从准备好的阻塞队列里面取出人的任务,放在线程池里面继续执行。

我们继续看下sendRequest里面做了什么:这个方法是在:HttpEngine,首先是创建request,然后构建缓存策略,进行socket连接:


创建请求的时候,根据请求情况会创建hhtps,或者http1


根据ip地址构建路由策略,同事建立socket连接:


此时神秘的okIo出现了:


构建了输入流和输出流,socket连接建立好以后,此时就可以正常的请求了,

下面看下这张图,可能更清晰:下面这张图来自:

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0326/2643.html


参考资料:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0326/2643.html












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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值