okHttp源码解析------待续

 

看该篇文章前首先要熟悉okHttp的使用,建议先读OkHttp的简单使用

本文的源码解析参考链接:okhttp3总和解析

1.从URL请求处理开始分析

由异步将请求加入调度方法开始引入正题:

getClient().newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}
});
/*** Prepares the {@code request} to be executed at some point in the future.*/@Override public Call newCall(Request request) {return new RealCall(this, request);}
@Override public void enqueue(Callback responseCallback) {enqueue(responseCallback, false);}void enqueue(Callback responseCallback, boolean forWebSocket) {synchronized (this) {if (executed) throw new IllegalStateException("Already Executed");executed = true;}client.dispatcher().enqueue(new AsyncCall(responseCallback, forWebSocket));}

由源码上的调用顺序,我们将步骤转化为以下的几个技术点:

 

由以上的使用okhttp请求的调用代码,可以看到最终的请求时通过dispatcher来完成的。

2.Dispatcher调度者

Dispatcher进行线程分发,有两个方法,一个是普通的单线程,也就是线程阻塞的方式请求;另一种就是通过队列进行并发任务的分发和回调,下面主要分析第二种:

 就是想到生成一个可缓存的线程池,实现高并发、低阻塞的任务调度。

 

3.Interceptor拦截器

拦截器主要用来观察、修改、以及可能短路的清除输出、和响应的回来。

通常用来添加、移除或者转换请求或者xiangying的头部信息。比如将域名替换为ip地址,将请求头中添加host属性,也可以添加我们应用中的一些公共参数,比如设备id、版本号等等。

http://www.jianshu.com/p/2710ed1e6b48 

 

4.缓存策略

 

4.Socket管理(StreamAllocation)

 

5.HTTP请求序列化/反序列化

 

6计算机常识

 

转载于:https://www.cnblogs.com/could-deng/p/6744974.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android studio JNI jni实例

1.Jni的作用 1.Jni的作用 Java是一种比较高级的语言,Java调用c库,调用c库是必不可少的,所以Jni就应运而生了。看了这个文章的同学,应该能够自己写个APK装在自己的手机里面吧,以前刚开始做android的时候,写…

二叉树先序遍历,中序遍历,后序遍历,层次遍历学习总结及完整C/C++代码

伪代码阐述 先序遍历 先序遍历:先访问根节点, 然后深入左子树,直到不能深入时再深入右子树 由定义可得递归式 void travPre_R(BinNodePosi* x,VISIT& visit){if(!X) return; //到达叶子节点,开始回归visit(x->data);//向左子树深入的过程中便开始进行对每个节点的数据…

nedc工况_东南DX3 EV续航升级 NEDC综合工况续航451公里

东南DX3 EV续航升级版车型曝光,电池系统能量密度由之前的141Wh/kg提升至了161Wh/kg,NEDC综合工况续航也由老款产品的351km提升至了451km。近日,工信部公布了2019年第7批《新能源汽车推广应用推荐车型目录》,东南DX3 EV续航升级版车…

不笑找我系列 | 程序员爆笑漫画十条

原创翻译~ 转载请说明出处~~~~~~~~ 1、如果你让码农给你做个事情,比如修个灯泡,他会这样去执行你的指令 2、分享一个码农发现并解决bug的过程,实在是符合我们码农的人设 3、码农的一天,像极了我的一天 4、至今为止,没…

AVL树学习总结

AVL树 平衡二叉树的缺点 由于平衡二叉搜索树的search(), insert(),remove()接口的运行时间与二叉树的高度成正比,所以若不能有效控制树高, 从平均复杂度来看,二叉平衡搜索树并不能让人满意 理想平衡 二叉树的性能取决于树的高度,只有当左右子树的高度接近时才能达到理想平衡…

nginx编译安装_Nginx编译安装nginx-upsync-module模块以实现动态负载

安装依赖包OpenSSL在官网下载页下到最新稳定版1.0.2q。PCRE在 PCRE 官网可以找到下载地址,这里选择8.x的最高版本 pcre-8.42.tar.gz。zlibzlib 直接选择官网首页最新的zlib-1.2.11.tar.gz。下载nginx 源码包及nginx-upsync-module模块源码这里下载的是nginx稳定版ng…

centos7 qt之程序编译 cant start process “cmake”

之所以出现这个问题,是由于qt内置的cmake与系统已安装的cmake命令冲突。解决的方法是,在build里将cmake命令加上绝对路径。 问题得以解决。转载于:https://www.cnblogs.com/jiu0821/p/6762343.html

码农笑话图片十张

原创翻译~转载请说明出处~~~~~~~~1、如果你让码农给你做个事情,比如修个灯泡,他会这样去执行你的指令2、分享一个码农发现并解决bug的过程,实在是符合我们码农的人设3、码农的一天,像极了我的一天4、至今为止,没有遇到…

伸展树学习总结

伸展树 与AVL树类似, 伸展树也是二叉搜索树的一种形式, 伸展树无需保证时刻保持全树的平衡,也不需要像AVL树一样要求记录平衡因子的附加信息 伸展树的提出源于信息访问的局部性(刚被访问过的信息有可能再次被访问,要被访问的元素可能位于刚访问过的元素的附近), 就伸展树而言…

python的if和else、for、while语法_python-变量、if else语句 、for循环、while循环(4月26号)...

变量:五.注意:python是可执行程序 在linux写python第一行必须写#!/usr/bin/env python(声明解释器在windows中写python第一行需要写# -*- coding:utf-8 -*-Pycharm:开发调试效率高 在pycharm中new project 并且每天创建一个目录右键diectory…

c语言 库打印函数

函数#include<stdio.h>int printf(const char *format, ... );/* [until c99]写结果到stdout */int printf(const char *restrict format, ... );/* [since c99] */int fprintf(FILE *stream, const char *format, ... );/* [until c99]写结果到文件流stream */int fprin…

xhprof windows下安装和使用(转载)

1、使用5.3.3以上的php版本&#xff0c;或者直接下载wamp2.1集成环境。 2、下载xhprof for windows版本&#xff0c;地址&#xff1a;http://www.benjamin-carl.de/?downloadXHProf-0.10.0-PHP-5.3.3-VC6-x86-TS&#xff0c;把解压后的dll文件放到php的ext目录里面。 关于这个…

B树学习总结

B树 多路搜索树 当数据规模足够大的时候, 大部分数据存储到外存中, 常规的平衡二叉搜索树将无法满足需求理由如下: 常规二叉平衡搜索树每当进行search(),insert(),remove()操作的时候就会进行节点的切换,从而导致大量的IO操作,就此提出了多路搜索,尝试将原本的多个节点合在一…

嵌入式未来趋势是什么?

感谢CSDN编辑邀请 前几天通过了CSDN博客专家的申请&#xff0c;在CSDN博客摸爬滚打多少个日日夜夜后终于修成正果了&#xff0c;当时通过CSDN博客专家时赶紧把消息发给了以前的创新基地同学&#xff0c;想起来&#xff0c;我们那时候刚开始学习单片机&#xff0c;就是从CSDN上面…

python如何调用阿里云接口_Python调用aliyun API设置阿里云负载均衡虚拟服务器组权重...

环境准备系统环境CentOS Linux release 7.2.1511 (Core)[rootlocalhost ~]# cat /proc/versionLinux version 3.10.0-327.el7.x86_64 (builderkbuilder.dev.centos.org) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Nov 19 22:10:57 UTC 2015[rootlocal…

js动态添加删除节点

转载于:https://www.cnblogs.com/jiaobaobao/p/6762692.html

C++与Java中的static成员总结

简述 在结构化程序设计中,内存中数据的共享是通过参数, 全局变量实现的; 在面向对象程序设计中函数与数据成员封装在一起, 数据共享通过类内部数据成员之间的相互访问, 外部对象则通过静态成员(即static成员)来共享数据; 接下来通过面向对象叙述static特性 C中的static 静…

书中自有黄金屋~外加中奖结果通知

人生的路很长&#xff0c;很艰辛&#xff0c;只有不断学习才能超越梦想&#xff0c;大牛是如何成长的&#xff01;首先要多看多听多写~~今天推荐一些大牛们都关注的技术公众号&#xff0c;机器学习、架构、前端、嵌入式、PY学习.....希望能够帮助到大家&#xff0c;引领我们前行…

python迭代算法_Python实现简单的梯度下降法

Python 实现简单的梯度下降法机器学习算法常常可以归结为求解一个最优化问题&#xff0c;而梯度下降法就是求解最优化问题的一个方法。梯度下降法(gradient descent)或最速下降法(steepest decent)&#xff0c;是求解无约束最优化问题的一种最常用的方法。梯度下降法实现简单&a…

[Linux]Linux应用程序中添加强制中断处理

注册CtrlC的按键signal信号捕捉&#xff0c;在捕捉到该动作后&#xff0c;强制退出应用程序 void handle_sig(int num) {printf( "%s\n", __func__ );exit(1); }int main( int argc, char **argv ) {signal(SIGINT, handle_sig); //....................... } 转载于…