Volley原理总结

  1. 通过Volley.newReuqestQueue新建一个请求队列,在创建请求队列的时候,会在后台开启5个线程,一个是缓存线程,4个网络请求的线程。

  2. 当我们往队列中加入request的时候,会检查request是否可以被缓存,默认情况下是可以的,如果用户设置了不可以被缓存,那么会直接将request加入到网络请求的队列当中。

  3. 如果可以被缓存,且如果没有相同的request正在请求,那么会将request加入到缓存队列,并在一个Hashmap中加入该Request的key,value为null。如果在Request请求的过程中,有相同的Request到来,那么会将这些新的Request通过链表连接,放入到Hashmap的value中。等待正在请求的Request完成之后,会将这些相同的Request全部取出,加入到缓存队列。

  4. 那么会判断是否已经有相同key的request正在请求,用于比较的数据结构是HashMap,其中key是request的key(method+url),value是Request的链表。如果有的话会将request加入Hashmap的链表之中,链表存放的是具有相同key的request。

  5. 缓存线程会不断从缓存队列中取出request,并查看是否已经有了缓存,如果有缓存并且缓存还没有过期,则会将response分发到主线程中进行回调,采用的是handler机制发送到主线程

  6. 如果缓存过期了,那么会将request加入到网络请求队列之中。网络请求线程会从网络请求队列中取出request,进行网络请求,请求完成之后会将结果进行缓存,并将结果传回主线程

  7. request完成的时候将保存在hashmap中的具有相同key的request取出来,全部加入到缓存队列,由于刚刚才完成对request的请求,所以缓存一般都是有效的,所以会直接把response分发给各个request对应的回调函数。

  8. 缓存是存在本地的,默认缓存大小是5M,如果缓存满了,会通过FIFO算法,将老的缓存进行删除。

以上就是本人对Volley的总结了,源码来来去去看了好几遍,总结一下比较好。

猜你喜欢

转载自blog.csdn.net/q1242027878/article/details/79728804