【OkHttp3源代码分析】(二)Request的enqueue
来源:互联网 发布:php 500错误如何排查 编辑:程序博客网 时间:2024/06/01 22:58
前言
如果没有阅读本系列文章的第一篇,请先阅读:
【OkHttp3源代码分析】(一)Request的execute
因为这两者之间是有关联的!
enqueue执行流程源代码分析
先来看看源代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
看到重点的那一行:
- 1
- 1
我们发现,它将我们的Callback接口封装到一个新的类AsyncCall中去。
我们来看看它的代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
要注意它是继承NamedRunnable的,这里我们从名字也可以看出,实际上它就是一个Runnable了。
简单看看NamedRunnable源代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
了解完之后,我们就可以知道哪个是重要的方法了。
没错就是:execute方法。(注意这个execute不是我们第一篇文章讲的那个)
然后我们发现它调用了:
- 1
- 1
实际上这个和Request的execute调用是一样的,只不过多了一个接口回掉的过程。这里我们就不再重复分析了。
OK,了解完AnsycCall类,我们回来来看看这句的enqueue:
- 1
- 1
首先我们都知道,OkHttp3中enqueue是异步通过执行,然后通过接口回调的!
再加上AsyncCall本质是一个Runnable。
所以用我们程序员本能的嗅觉,其实已经能够大概擦觉到,这个client.dispatcher()通过自己封装的线程池,执行我们的AsyncCall的execute方法了!
但是要是没有察觉到也没有关系,我们看看源代码就知道是什么了!
我们来看看Dispatcher类的enqueue方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
嘿嘿,果然和我们想的没有错,的确是使用了线程池:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
小吐槽…这样写好像有点影响性能的样子。通过synchronized实现单例模式。 还不如使用双重判断锁的方式来实现,可以提升一定的性能,也避免synchronized开销啊!!!
至此,我们已经完成了enqueue的分析了! 如果看懂了上篇文章的execute,看懂这个真的只是分分钟的事情了!!
-Hans 2016.4.3 22:05
转自:http://blog.csdn.net/qq_18402085/article/details/51052350
- 【OkHttp3源代码分析】(二)Request的enqueue
- 【OkHttp3源代码分析】(二)Request的enqueue
- 【OkHttp3源代码分析】(一)Request的execute
- 【OkHttp3源代码分析】(一)Request的execute
- OkHttp3源码分析(二)
- okhttp3相关封装配置(二):Request对象
- Android 源码分析之okhttp3(builder二)
- Android ActionBar的源代码分析(二)
- Rails源代码分析(4):Request/Response
- Struts2源代码分析(二)类ContainerImpl的实现分析
- TCPMP源代码分析(二)
- Iperf 源代码分析(二)
- Hadoop源代码分析(二)
- yaffs2源代码分析(二)
- Iperf 源代码分析(二)
- yaffs2源代码分析(二)
- Gzip源代码分析(二)
- Iperf 源代码分析(二)
- 华为OJ--合唱队
- Android-拼图小游戏
- 自定义LayoutManager实现android-pile-layout滑动卡片堆叠效果
- PE格式详细讲解6(上)- 系统篇06
- MAC 无法重启或关机
- 【OkHttp3源代码分析】(二)Request的enqueue
- WebService-写简单接口
- Visual Studio2015下配置Halcon环境(使用的是VS下的C#)
- ThreadLocal用法及与Synchronized的区别
- 使用函数输出指定范围内的完数
- SQL基础
- 不得不知道的微信小程序避坑指南
- VBA代码学习
- MAC 卸载MySQL