Volley框架原理准备

1,在我们使用Volley框架进行网络请求发送时,首先会调用 Volley.newRequestQueue来生成一个请求队列,我们调用的newRequestQueue是一个重载函数。

2,newRequestQueue返回的是一个请求队列的对象RequestQueue,而且返回的RequestQueue是已经启动了的,即已经调用了start方法。

3,那么这个启动了的请求队列是如何进行请求的获取以及发送的呢,在newRequestQueue的方法中,首先是对当前程序运行的Android机器的SDK版本进行了获取,当Android版本是2.3以下时,就会实例化一个HttpClientStack,当Android版本是2.3以上时,就会实例化一个HurlStack,而这两个类都是接口HttpStack的实现类。而HttpStack接口内部之后一个方法,那就是performRequest,即发送请求。也就是说volley根据当前机器的Android SDK版本不同选择了不同的发送请求的实现方式。当手机为Android 2.3版本以下时,volley底层通过HttpClient来进行网络请求发送,即在构建请求队列时实例化了一个HttpClientStack对象来进行请求发送,当手机为Android2.3及以上时Volley底层通过HTTPURLConnection来进行网络请求发送,即在构建RequestQueue时,实例化了一个HUrlStack对象来进行请求发送。

4,这里在newRequestQueue方法中在处理网络请求时,实例化了一个Network对象,这个Network对象内部便是基于HttpStack来发送请求的

5,那么volley框架到底是怎么进行请求的获取并且分别进行处理的呢,前面说了,newRequestQueue对象返回的是一个已经启动了的请求队列,也就是说在newRequestQueue方法中已经调用了start方法。

6,在RequestQueue的start方法中可以知道,volley框架在初始化请求队列RequestQueue时新建了五个线程,一个是cacheDispather线程,以及四个networkDispatcher线程,即一个缓存线程,四个网络线程。并且这五个线程都执行了start方法。这也就是说volley框架中的异步处理其实是没有采用线程池的方式,而是默认构建五个线程,并对他们进行管理从而实现的网络通信异步。

7,这五个线程多通过调用start方法进行了启动。

8,在网络线程networkDispatcher的run方法中,通过while(true) 的死循环来尝试从请求队列中获取请求,当获取到请求之后,便会调用performRequest方法执行网络请求。

9,执行完网络请求之后,便是对返回的网络数据包进行解析,这里调用的是parseNetworkResponce方法来进行数据包的解析,拿到解析之后的Response对象之后,会将数据进行回调,首先创建了一个ResponseDeliveryRunnable对象,并且通过handler.post使得该runnable对象在主线程中执行,之后便是将数据回调到了Response.Listener的onReponse方法中,将网络请求的响应数据Response通过回调传到了主线程。然后开发者就可以在主线程中对数据进行操作,譬如显示之类的。

10,同时我们记得newRequestQueue方法中是实例化了五个线程,除了四个网络线程NetworkDispatcher之外,还有一个缓存线程CacheDispather,主要是用于从缓存中获取数据。
11,在缓存线程CacheDispather的run方法中可以知道,该线程首先会判断缓存中是否有网络请求中请求的数据,如果没有的话则将请求加入网络队列中,通过网络线程进行请求的处理。如果缓存中存在请求的数据,则首先对网络中缓存的数据进行新鲜度的判断,即判断需不需要刷新数据,如果需要刷新则仍然进行网络请求的发送,如果不需要,则从缓存中直接读取数据。

12,那么请求是怎么添加进请求队列的呢,就是显示的调用RequestQueue.add方法,将请求添加进了请求队列。在我们通过add方法添加请求时,便会判断该请求是否需要缓存,不需要的话就添加入网络队列中,否则则将该请求添加入缓存队列中。

13 关于Volley的缓存空间,默认的缓存空间是5M,如果申请缓存空间时超过了5M就会对缓存空间进行清理,缓存空间是使用的Map结构,需要清理的时候就会对Map进行遍历,将文件进行删除,直到剩余的空闲空间可以满足本次缓存空间的申请。

这个是Volley框架的一个缺点,可以使用LRUCache进行优化。

你可能感兴趣的:(android)