开源项目分析之-Volley

来源:互联网 发布:java适用于什么环境 编辑:程序博客网 时间:2024/04/30 02:13

趁有时间,赶紧记录一下自己对Volley的理解,算不上很透彻,但毕竟开始了,不是么。同样,本文也是基于CodeKK的文章思路,毕竟是菜啊。
CodeKK-Volley源码分析
CodeKK的分析很宏观,也告诉了你某些类的某些方法,但是当我第一次看的时候还是看不懂,但是呢,多看几遍之后,感觉慢慢找到方法了,我会看完他们的开源项目分析,然后再自己去挖掘更新的开源项目,在这里,真心感谢CodeKK的作者们。
Volley是Google推出的Android异步网络请求框架和图片加载框架。特别适合数据量小,通信频繁的网络操作,借用CodeKK的话说,Android中几乎都是这种类型。
这里写图片描述
我们还是copy一张整体结构图先。
大致的流程我还是想copy一下,因为写得很好

上面是 Volley 的总体设计图,主要是通过两种Dispatch Thread不断从RequestQueue中取出请求,根据是否已缓存调用Cache或Network这两类数据获取接口之一,从内存缓存或是服务器取得请求的数据,然后交由ResponseDelivery去做结果分发及回调处理。
总的来看,该项目比UIL要清晰明朗,这篇文章也主要是理清他的大致流程。
从小白的角度,我们看下这段代码

RequestQueue queue = Volley.newRequestQueue(getApplicationContext(),                new HurlStack());        StringRequest request = new StringRequest("www",                new Listener<String>() {                    @Override                    public void onResponse(String response) {                    }                }, new ErrorListener() {                    @Override                    public void onErrorResponse(VolleyError error) {                    }                });        queue.add(request);        queue.start();

我们新建了一个队列,然后将一个StringRequest添加到了队列中,队列启动,我们来看看后面发生了什么。一旦这个队列start之后,我们干两件事。
1.创建缓存分发器(CacheDispatcher),开启
2.创建若干个网络分发器(NetworkDispatcher),开启
在RequestQueue中持有缓存队列和网络队列,都为优先级阻塞队列。
CacheDispatcher需要缓存队列,网络队列,缓存,以及拿到结果后要调用的处理器
NetworkDispatcher需要网络队列,网络请求器,缓存,处理器
缓存分发器
在说这个之前我们很有必要知道,当一个请求添加到RequestQueue的时候,他走的具体是怎样的流程。
如果不能缓存,则直接进入网络队列

if (!request.shouldCache()) {            mNetworkQueue.add(request);            return request;        }

如果这个请求已经在等待队列中了

 if (mWaitingRequests.containsKey(cacheKey)) {                // There is already a request in flight. Queue up.                Queue<Request<?>> stagedRequests = mWaitingRequests.get(cacheKey);                if (stagedRequests == null) {                    stagedRequests = new LinkedList<Request<?>>();                }                stagedRequests.add(request);                mWaitingRequests.put(cacheKey, stagedRequests);

如果既没有在等待队列中,也可以缓存

mWaitingRequests.put(cacheKey, null);mCacheQueue.add(request);

我们接下来看一看缓存分发器开启后干了哪些事情
CacheDispatcher extends Thread,看run方法
先从缓存请求队列中拿出请求,再尝试从磁盘缓存中根据请求来得到返回实体。
如果没拿到,则将请求放入网络队列,说明要重新发起网络请求,如果返回的实体过期了,也要将该请求放入网络队列。再往后走,如果我们拿到的是可用的返回实体,我们将其转化成可在网络上传输的对象。然后通过ResponseDelivery把Response返回回去,最后你最初的Request会监听这个动作,拿到Response。
网络分发器
我们也是要从run方法看起。
发起网络请求的类为BasicNetWork,它执行performRequest方法来发起请求,得到一个NetworkResponse。

 if (request.shouldCache() && response.cacheEntry != null) {                    mCache.put(request.getCacheKey(), response.cacheEntry);                    request.addMarker("network-cache-written");                }

如果这个请求是可缓存的

if (request.shouldCache() && response.cacheEntry != null) {                    mCache.put(request.getCacheKey(), response.cacheEntry);                    request.addMarker("network-cache-written");                }

当我们拿到返回体后,剩下的事情就交给ResponseDelivery了。

1 0
原创粉丝点击