开源项目分析之-Volley

趁有时间,赶紧记录一下自己对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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值