天天看点

Volley框架源码浅析(一)

尊重原创

       从今天开始,我打算为大家呈现关于Volley框架的源码分析的文章,Volley框架是Google在2013年发布的,主要用于实现频繁而且粒度比较细小的Http请求,在此之前Android中进行Http请求通常是使用HttpUrlConnection和HttpClient进行,但是使用起来非常麻烦,而且效率比较地下,我想谷歌正式基于此种原因发布了Volley框架,其实出了Volley框架意外,也有一些http请求开源项目,比如使用比较广泛的有async-http,UniversImageLoader等等,其中async-http主要用来实现异步http请求,而后者主要用来请求图片。Volley具有以上两种框架的功能,并且是Google公司发布,我想作为Android开发者,很有必要研究一下该框架。

1、下载Volley框架

git clone https://android.googlesource.com/platform/frameworks/volley

2、引用Volley框架

引用该框架的方式主要有两种:

(1):直接导入Volley框架,作为lib使用

(2):编译Volley成jar包

3、Volley的功能:

前面已经提及了Volley是一个用于http请求的框架,其主要功能如下:

json,xml,String,Image等资源的请求,当然我们还可以根据自己的需要来改写Volley框架源码,从而实现自己的功能

4、Volley源码分析

温馨提醒:如果是第一次看Volley源码,第一遍没看懂没关系,将源码copy下来,跟着我的思路慢慢分析,将文章从头到后多看几遍就ok了,因为Volley的一些关键类都互相应用,我只能一个一个的分析了,等你看完我所有的文章,然后再从头看一变,相信你定有所收获

当然阅读次文章之前,最好学会知道Volley框架的基本使用,由于网络上很多类似的教程,我在此处就不再描述了,后期如果有时间我也会讲解一下Volley的应用

我们就从Volley这个类开始吧

(1) Volley.java

Volley类主要用来创建一个请求队列,我们的任何请求(请求字符串,json,xml)都放入到这个队列中(其实里面有两个队列,后面我们慢慢学习,暂时简单理解为一个)。创建完队列后,调用start方法,就会启动一些线程(暂时不关注多少条线程),不断监听队里里面是否有请求,如果有请求则执行http请求,在2.3之前的版本中,Http请求是通过httpClient实现,在2.3以后的版本中是通过HttpURLConnection实现,因为在2.3之前的版本中HttpRlConnection非常不稳定

(2) HttpStack.java

下面看看HttpStack是何方神圣

直接查看它的子类方法吧

首先看  HurlStack.java类

这个类是基于HttpURLConnection实现的

由于这个类比较长,我就重点讲解一下

(3) HurlStack.java

(4) HttpClientStack.java

看到这里大家肯定觉得这个框架也没有什么了不起嘛,和使用HttpURLConnection和HttpClient差不多嘛,如果你真的这样觉得那么你就大错特错了,其实这个框架的核心在于线程的调度和缓存上面,后期我们会介绍的

回到Volley类,我们看下一个陌生的类就是Network,其实Network不过是个接口而已,它的实现类是BaskNetwork

(5) BaskicNetwork.java

从名字我们就可以看出来,这个类就是进行网络请求的,其实他就是对HttpurlStack或者HttpClientStack的一个封装,真正实现请求的还是上面两个类。

最核心的方法:

这个方法调用了mHttpStack的同名方法,只不过在mHttpStack中返回的是HttpResponse,在这里返回的是NetworkResponse。

然后再看看本篇文章的最后一个类:

RequestQueue.java

我保留了一些关键字段,删除不影响理解的字段

写到这里先高一段落吧,来个小小的总结:Volley中有一个RequestQueue(包含本地队列和网络队列),就是请求队列,每一个http请求都被封装成了一个Request,通过队列的add方法加入队列,如果一个Request可以缓存,那么先加入本地队列,如果不能缓存则加入网络队列

待续。。。。。。。

欢迎留言讨论。。。

继续阅读