上面一个章节,从volley的主要使用流程来大概分析了一下代码,这一章将详细的网络请求流程从源码角度分析一波。
前面一章讲了NetworkDispatcher.java,这个线程主要任务就是网络请求和处理,其中run()函数中执行网络请求的代码如下:
|
|
performRequest函数的实现,我们看一下BasicNetwork中performRequest函数(其中BasicNetwork.java是Network的实现类),代码很多,我截取了一部分核心的代码片段:
|
|
代码比较多,前一部分代码就是做网络请求,后面一部分是对网络请求返回的response进行处理(包括head和entity)。网络请求的代码就一行:
|
|
mHttpStack就是一个接口,它有两个实现类,就是我们上一章介绍的RequestQueue,当API>=9的时候,使用HurlStack,反之,使用HttpClientStack。这两个stack就是HttpStack的具体实现类。
1、我们先看一下HurlStack实现performRequest方法。
1.1 首先获取request中的url。
|
|
1.2 打开http连接。
|
|
openConnection实现方法,代码如下:
|
|
如代码所示,openConnection方法使用系统的HttpURLConnection类,设置timeout,缓存等参数,然后return。
1.3 打开网络连接了,我们继续看performRequest方法。
|
|
如函数名字意思一样,就是为request设置一些parameters,我们看一下这个函数。
|
|
就是设置一些请求的方法。
1.4 返回code,报错处理
|
|
1.5 最后返回response
|
|
2、我们再看一下HttpClientStack的实现方法
|
|
这里创建的网络请求是使用HttpClient中HttpUriRequest包来做网络请求,下面类似于HurlStack,用来添加参数。
好啦,介绍好了两个实现类(HttpClientStack和HurlStack)中performRequest的实现方法,我们在继续BasicNetwork的performRequest方法。
|
|
把request的head和Entry进行包装。
|
|
最后return新的response。
现在网络请求已经完成,下面就应该开一个线程,把这个网络请求跑起来啦。我们再回到networkDispatcher.java中。
|
|
我们看一下ResponseDelivery实现类ExecutorDelivery中的postResponse方法。
|
|
这个方法,把request网络请求放到ResponseDeliveryRunnable中。
这大概就是我理解的volley网络请求的详细流程,如果有哪里不对的地方,希望大神们指点一二。