Volley原理分析

使用了一段时间的volley的框架,感觉只知其然不知其所以然,不满足封装扩展,顾花了些时间研究一下其实现原理,如有出入欢迎指正~闲言少叙直接奔主题。

下面是根据理解自行画制的Volley的类图关系:


大家都知道在使用volley,三步走:

第一步:初始化Volley:RequestQueue mQueue = Volley.newRequestQueue(context);

第二步:创建Request:XXXRequest request=new XXXRequest(......);

第三步:加入队列中:mQueue.Add(request);

详细过程:

第一步,初始化RequestQueue消息队列,requestQueue中有四个消息队列mCurrentRequestQueues(HashSet集合,存放请求的消息)、mNetworkQueue(

PriorityBlockingQUeue的队列,存放需要网络通信的请求消息)、mCacheQueue(PriorityBlockingQUeue的队列,存放需要使用缓存的请求消息)、

mWaitingRequest(是一个HashMap集合,用于存放已经使用过的缓存请求)。两个调度器,mCacheDispatcher(缓存使用调度器)、mDispatchers(网络请求调度器)。相应传递器,mDelivery。除初始化RequestQueue消息队列机调度器外,还调用消息队列的srart()方法。RequestQueue中srart()方法中同时启动mCacheDispatchermDispatchers调度器,这两个调度器都是继承Thread的线程。

1、CacheDispatcher 缓存处理线程,

此线程主要请求为缓存的请求,首先对缓存吃进行初始化,然后根据Request.getRequestKey()的key获取缓存池中的缓存,交由分发器处理mDelivery,如果缓存池中没有对应的数据,则放到网络请求消息队列中。

2、NeworkDispatcher 网络处理线程,此线程处理需要请求网络网络请求的请求。网络请求调用通信器的performRequest()方法获取服务端信息,同时根据设置是否放入到缓存中。然后通过分发器回调给请求者。


第二步,创建Request请求,StringRequwst、JsonRequest之类的请求。


第三步,就是把请求加入到消息队列中,通过ReqestQueue.Add()方法加入到mCurrentRequestQueues消息队列中,同时会根据初始化时候的配置,将消息放到缓存请求队列中还是网络请求的消息队列中。如果初始化设置了没有使用缓存,将请求消息再放到mNetworkQueue网络请求的消息队列当中,如果设置了缓存则贤判断是否已经在调用的缓存队列中mWaitingRequest,如果没有在mWaitingRequest队列里面则将消息放入到mCacheQueue队列中同时放到mWaitingRequest的队列中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章