【Android okhttp源码解析 二】同步请求流程和源码分析_第1张图片 >okhttp源码解析系列文章: >第一篇:《okhttp框架简单介绍》 >https://blog.csdn.net/colinandroid/article/details/79774907 >第二篇:《同步请求流程和源码分析》 >https://blog.csdn.net/colinandroid/article/details/79774918 >第三篇:《异步请求流程和源码分析》 >https://blog.csdn.net/colinandroid/article/details/79774932 >第四篇:《任务调度核心类dispatcher解析》 >https://blog.csdn.net/colinandroid/article/details/79774936 >第五篇:《拦截器流程和源码解析》 >https://blog.csdn.net/colinandroid/article/details/79706161 ####1. 创建OkHttpClient对象 ![这里写图片描述](https://img-blog.csdn.net/20180326233848954?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 这里使用Builder模式来给OkHttpClient对象的成员变量赋值,这里最重要的两个成员变量时***dispatcher***和***connectionPool***。其中, #####(1)***dispatcher***是一个分发器类,由它决定网络请求是直接处理还是缓存等待,对于同步请求,这个分发器只是把同步请求放到队列当中。 #####(2)***connectionPool***是一个连接池,客户端和服务端之间的连接可以抽象为一个***connection***,而每一个***connection***我们都把它放到连接池中,由它来进行统一的管理,例如,当请求的url相同时就可以选择复用。 ####2. 创建Request对象 Request对象携带了请求报文的一些信息,如url地址,请求方法,请求头等。 ![这里写图片描述](https://img-blog.csdn.net/20180327000818713?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ####3. 创建Call对象 Call对象代表了一个实际的http请求。由于Call是一个接口,其实际请求都是通过RealCall来实现的。 ![这里写图片描述](https://img-blog.csdn.net/20180327000919031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 我们来看下RealCall的实现 ![这里写图片描述](https://img-blog.csdn.net/20180327001110581?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 首先创建一个RealCall,然后给一个监听赋值。我们来看看RealCall的构造方法里做了什么 ![这里写图片描述](https://img-blog.csdn.net/20180327001331086?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 可以看到RealCall持有了client对象和request对象,并初始化了一个重定向拦截器。 ####4. 执行请求 我们知道执行请求其实就是调用Call对象的execute方法,而实际调用的是RealCall的execute方法,我们来看一下。 ![这里写图片描述](https://img-blog.csdn.net/20180327001604687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 我们这里主要关注一下主流程,首先执行okHttpClient的dispatcher的execute()方法 ![这里写图片描述](https://img-blog.csdn.net/20180328162416890?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvbGluYW5kcm9pZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 我们看到,execute()方法其实就是将Call对象加入同步队列当中,dispatcher负责请求的分发,依次去执行同步队列里的请求。 除了同步执行队列runningSyncCalls,还有异步执行队列runningAsyncCalls和异步就绪队列readyAsyncCalls。 在执行完execute()方法后,会调用getResponseWithInterceptorChain()方法来获取response,在这个方法里会依次调用拦截器来进行相应操作。 这里还要注意,在拿到response后还调用了dispatcher的finish方法。 ![这里写图片描述](https://img-blog.csdn.net/20180328170028608?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvbGluYW5kcm9pZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 这里是把当前请求从runningSyncCalls队列中移除,接着计算所有正在执行的同步请求和异步请求队列中请求数,如果请求数为0则回调idleCallback()方法。 可以看到,同步请求的执行方法的执行过程比较简单,主要就是 保存同步请求移除同步请求

更多相关文章

  1. Android 访问Webservice接口,参数对象不能串行化问题解决(java.lan
  2. Android GridView的使用方法
  3. Activity之间传递对象
  4. ScrollView拉到尽头时出现阴影的解决方法
  5. php、java、android、ios通用的3des+base64加密方法
  6. android中webView JS调用Android的方法、webView的下拉刷新(Swipe
  7. 转:Android中几种图像特效处理方法小结
  8. Android中Activity状态的保存和恢复:onSaveInstanceState和onRest

随机推荐

  1. Mysql中时间戳转为Date的方法示例
  2. MySQL全面瓦解之查询的正则匹配详解
  3. Navicat 连接MySQL8.0.11出现2059错误
  4. 阿里云服务器安装Mysql数据库的详细教程
  5. MySQL全面瓦解之查询的过滤条件详解
  6. MySQL查询重写插件的使用
  7. MySQL5.5 部署的一个问题
  8. MySQL中的undo日志
  9. 详解MySQL alter ignore 语法
  10. 解决mysql 组合AND和OR带来的问题