Volley-v1.1.1源码流程图
2020-10-15 18:00:54 0 举报
登录查看完整内容
Volley源码流程分析
作者其他创作
大纲/内容
13:sendRequestOverNetwork
9:executeRequest
6:run
3:newRequestQueue
11:executeRequest
10:performRequest
5:processRequest
RequestQueue
返回HttpResponse对象
HurlStack
3:run
2:newRequestQueue
1:start
一、网络请求部分
NetworkDispatcher
8:performRequest
5:start
6:get
4:processRequest
ExecutorDelivery
BasicNetwork
CacheDispatcher
9:performRequest
Volley
12:beginRequest
返回NetworkResponse对象
12:put
7:performRequest
7:postResponse
8:ResponseDeliveryRunnable/run
获取存储的数据步骤:1、当初始化完成的时候,调用到RequestQueue类的start()方法,当创建RequestQueue对象时会优先创建DiskBasedCache磁盘存储对象,DiskBasedCache磁盘存储对象作为参数传入RequestQueue对象中;DiskBasedCache磁盘存储是一个Lru磁盘存储,内部创建了LinkedHashMap基于Lru算法的双链表集合(常用数据保留原则),DiskBasedCache磁盘存储对象规定存储大小上限为5M,超过5M会删除不常用数据,处理后数据通过文件存储在磁盘中;创建好缓存器后调用RequestQueue对象start()方法进行读取磁盘数据2、调用CacheDispatcher对象start()方法, CacheDispatcher对象是一个线程对象,传入了磁盘存储器、磁盘缓存队列、网络请求队列以及ExecutorDelivery线程切换执行者对象,该类主要是是一个线程通过死循环不断的读取磁盘队列的请求者对象,通过请求者对象获取磁盘存储数据,通过线程切换器进行子线程切换到主线程将响应通过监听方法回调给使用者3、调用到CacheDispatcher线程对象的run()方法,首先设置线程优先级;然后初始化Lru磁盘缓存器以及计算缓存数据大小;最后实现一个无限循环读取磁盘缓存队列的请求者,通过请求者获取磁盘缓存数据4、读取磁盘缓存队列的请求者,通过请求者获取磁盘缓存数据5、当从磁盘缓存队列获取到请求者,首先判断请求是否取消,取消则退出,否则通过Lru磁盘存储器获取磁盘存储数据;如果获取的数据是空数据说明没有存储,那么就将当前请求者加入网络请求队列进行网络请求数据(查看第一部分网络请求第6步);接下来判断磁盘存储数据是否过时,过时就将当前请求者加入网络请求队列进行网络请求数据;如果缓存里有数据并且未过时,那么就将获取的缓存数据转化为响应对象,判断响应数据是否合法成功,不合法则将当前请求者加入网络请求队列进行网络请求数据;否则继续判断数据是否需要刷新,需要刷新则将当前请求者加入网络请求队列进行网络请求数据,否则调用ExecutorDelivery线程切换执行者对象的postResponse()方法进行子线程切换到主线程并且通过监听回调将响应回调给使用者6、调用DiskBasedCache磁盘存储对象get()方法,获取存储在磁盘的数据并且返回7、进过一系列的判断缓存数据是可用的情况下,将存储的数据响应给使用者8、调用ExecutorDelivery线程切换执行者对象中内部类实现ResponseDeliveryRunnable类的run()方法,调用监听回调方法将响应回调出去磁盘存储步骤:9:当通过网络请求队列获取到请求者对象(查看第一部分的第7步)进行网络请求10、调用BasicNetwork类的performRequest()方法,具体操作查看第一部分的第8步11、调用到HurlStack类的executeRequest方法,该类是网络连接的具体实现类,通过URL创建一个HttpURLConnection网络连接对象,然后设置网络连接器的配置,包括请求头、请求体、请求方式、连接超时时间及请求时间等等,最后将请求响应返回12、获取到网络请求成功的响应,判断存储允许则调用DiskBasedCache磁盘存储对象put()方法进行请求数据存储到磁盘中, 到此存储完成总结:Volley中创建了多个网络请求实体线程,可以处理频繁与并发的网络请求;存储采用Lru算法,并且存储大小上限为5M,因此该框架比较适合小数网络请求,对于大数据的请求如下载可能会导致资源丢失等问题,所以通过源码可以知道Volley更适合什么场景
网络请求步骤:1、调用Volley类的newRequestQueue方法,传入单参数上下文,返回一个RequestQueue对象,RequestQueue对象是一个请求队列管理类,管理者缓存队列与网络请求队列2、根据android版本判断创建网络链接器,当android版本大于9时先创建一个HurlStack对象,HurlStack对象是一个真正的网络链接器,通过URL创建一个HttpURLConnection网络连接对象,然后设置网络连接器的配置,包括请求头、请求体、请求方式、连接超时时间及请求时间等等;创建一个BasicNetwork对象传入HurlStack对象作为网络连接器的管理类,管理网络连接请求与响应3、初始化换数据缓存的目录路径,最终创建RequestQueue对象并且返回, 调用RequestQueue对象的start()初始化请求队列4、 调用RequestQueue对象的start()初始化请求队列,首先创建缓存PriorityBlockingQueue优先队列以及网络请求PriorityBlockingQueue优先队列,PriorityBlockingQueue优先队列会根据添加对象设置的优先性判断,即添加的对象实现Comparable接口重写的compareTo方法,在compareTo方法中进行优先性判断处理,返回int类型,返回的值大代表优先性高;创建缓存队列线程CacheDispatcher对象以及网络队列线程NetworkDispatcher对象,开启队列线程之前先关闭开启的缓存队列线程与网络队列线程;默认创建4个数量级的网络队列线程NetworkDispatcher对象(用于处理高并发等问题);此处我们分析网络请求,调用到NetworkDispatcher线程对象的start()方法5、调用到NetworkDispatcher线程对象的start()方法开启子线程工作,回调到NetworkDispatcher线程对象的run方法6、首先设置线程的优先级;然后通过一个死循环不断获取网络请求PriorityBlockingQueue优先队列的请求对象,也就是当把请求对象如StringRequest添加到网络请求PriorityBlockingQueue优先队列中,那么就可以通过这个循环读取到(该循环是一个死循环,除了调用停止不会不会结束循环)7、获取网络请求PriorityBlockingQueue优先队列的请求对象,调用processRequest进行下一步处理8、进行网络请求对象合法性判断,然后调用BasicNetwork类的performRequest方法进行真正的网络连接请求并且返回网络响应;最后调用ExecutorDelivery类的postResponse方法进行响应回调通知到使用者,ExecutorDelivery对象是一个线程切换执行对象,在创建RequestQueue对象时会创建一个主线程handler对象封装的ExecutorDelivery对象,也就是ExecutorDelivery对象默认是主线程池对象(可以自定义其他线程),内部有一个ResponseDeliveryRunnable实现类,当使用ExecutorDelivery对象默认是主线程时,就是通过子线程切换到主线程,最后回调到ResponseDeliveryRunnable类的run方法进而调用监听回调方法9、调用到HurlStack类的executeRequest方法,该类是网络连接的具体实现类,通过URL创建一个HttpURLConnection网络连接对象,然后设置网络连接器的配置,包括请求头、请求体、请求方式、连接超时时间及请求时间等等,最后将请求响应返回10、网络请求完成返回网络响应,然后调用ExecutorDelivery类的postResponse方法进行响应回调通知到使用者,此处进行了子线程切换到主线程; 到此一个网络请求完成11、当定义好请求对象时,如StringRequest对象,将请求对象添加到网络请求PriorityBlockingQueue优先队列中,然后在NetworkDispatcher线程对象的run方法中的通过循环读取到该请求对象进行网络请求(具体查看第6步)12、判断是否需要缓存,不需要就将请求添加到网络优先队列中,否则就添加到缓存优先队列中13、就将请求添加到网络优先队列中,然后在NetworkDispatcher线程对象的run方法中的通过循环读取到该请求对象进行网络请求(具体查看第6步)
10:postResponse
二、缓存流程
4:start
1:newRequestQueue
2:start
11:add
DiskBasedCache
0 条评论
回复 删除
下一页