Volley框架解析(一)-----整体介绍

Volley框架解析(一)—–整体介绍


    感谢各位菊苣,grumoon,huxian99,trinea,郭霖juju的图片素材,以及详细的分析。

    其他菊苣关于Volley解析的链接如下:

    codeKK—Volley源码解析

    郭霖juju—Android Volley完全解析(一),初识Volley的基本用法


题外话(可直接跳过orz

    在Android路上的第一个涉及到网络的项目中,就用到了Volley,当时也就照着网上的方法用了用,用到后面发现满足不了需求之后,尝试着去自定义了一些request,自己去结合Volley来处理服务器返回的cookie。第一个项目已经过去时间比较长了,突然想到想深入的了解下Volley,于是就开始了Volley源码之旅…..本人比较笨,需要比其他人花更多的时间来消化,没办法orz。看了比较长的一段时间后,把自己边看边写的笔记拿出来和大家分享。

1. Volley简介

1.1 Volley是什么

    Volley是Google推出的Android异步网络请求框架和图片加载的框架。适合数据量小的,通信频繁的各种请求,官方已经封装好了各种API,而且还提供了很灵活的自定义请求接口,不仅使用起来方便,可扩展性也很强。来一张google配图 (也是偷的orz,pia~, 啊哦,表打脸…
volley

    可以通过下面的几种途径获取到volley的代码:

git clone https://android.googlesource.com/platform/frameworks/volley  

jar包下载地址: http://www.kwstu.com/ResourcesView/kwstu_201441183330928 
1.2 整体框架

    这是从上面提到的菊苣那里拿来的一张图,十分感谢Orz,这张图大致的分析出了Volley中Request从开始到结束需要经历的一个流程,在后面会详细的分析request每一步的动向,这里先简单的做个介绍。
design

    最开始用到Volley发送请求的时候需要通过如下的几行代码(注意给应用添加网络访问的权限),

//先新建一个请求队列(RequestQueue)
RequestQueue mQueue = Volley.newRequestQueue(context); 

//新建一个request
StringRequest stringRequest = new StringRequest("http://www.xxxxxxx.com",  
                    new Response.Listener<String>() {  
                        @Override  
                        public void onResponse(String response) {  
                            Log.d("TAG", response);  
                        }  
                    }, new Response.ErrorListener() {  
                        @Override  
                        public void onErrorResponse(VolleyError error) {  
                            Log.e("TAG", error.getMessage(), error);  
                        }  
                    });

//将request加入到队列(RequestQueue)当中
mQueue.add(stringRequest); 

    做完上面的这些工作,如果不出问题,等着request返回结果就可以了。结合上面的图片,mQueue(RequestQueue)被创建之后,会启动新的工作线程(dispatcher)开始工作,mQueue里面有专门用来存放request的容器,只要没被stop,这些工作线程会不停的从容器中取出request进行处理,工作线程大致分为两类:

  1. 处理有缓存存在的request的dispatcher。该工作线程会涉及到从之前存储的有效缓存(cache)中读取数据并返回给调用者。
  2. 处理网络请求的request的dispatcher。该工作线程会涉及到从网络(network)获取有效的数据,并返回合适数据给调用者,并会根据request的设置来决定是否将请求结果缓存到本地。

    在工作线程得到了请求响应结果response之后,会将response交给ResponseDelivery来处理并通过回调传递给调用者。

    通过上面的介绍,应该能大致的了解volley中,一个request创建并加入到RequestQueue之后大致的一个走向。

1.3 基础类的简介

    在Volley中一共有43个类(不知道当前阅读的是否为最新版本的,不过核心类差不了很远),主要介绍一下核心类以及其在Volley中起的作用,后面会对核心类的每行代码进行展开分析。

Volley.java: 从上面的用法Volley.newRequestQueue就能看出,Volley类是对外的接口,里面仅有4个重载了的newRequestQueue()函数,用来以各种不同的方式创建并启动一个RequestQueue。

RequestQueue.java: 外界通过Volley中的接口来创建其实例,RequestQueue的作用就是存放所有add进来的Request(所有的Request不仅会存放在mCurrentRequests里面,其原型是一个HashSet。而且Request还会被分类存放在mCacheQueuemNetworkQueue中,分类的标准是是否涉及到网络数据的获取),并且里面会有两类调度器mDispatchersmCacheDispatcher来负责处理Request。前者用来处理涉及到网络的Request,后者用来处理直接从缓存中获取数据的Request。它俩获得了数据之后都会交给mDelivery(ResponseDelivery.java的实例)来传递回caller。

Request.java: 请求类的基类,所有请求类都从该类继承。里面包含了请求方法(POST,GET等),用户可自定义符合需求的Request,自由度很大。

NetworkDispatcher.java: 处理网络请求的调度器,继承自Thread类,其中包含了用于存储涉及网络请求的mQueue,以及用于网络请求的接口类mNetwork(Network.java实例)。在被停止之前进行死循环,调度器会不停的从mQueue中取出request来处理,将结果通过mCache(Cache.java实例)写入本地缓存中,通过mDelivery(ResponseDelivery.java实例)将结果回传给caller。

CacheDispatcher.java: 处理缓存请求的调度器,继承自Thread类,包含了用于存储涉及缓存请求的队列mCacheQueue,和上面的网络调度器工作原理类似。只是从缓存中取出数据再通过mDelivery返回给caller。

ResponseDelivery.java: 一个用于将Response传递给调用者的回调接口,包含了两类回调方法,postResponse(Request<?> request, Response<?> response, Runnable runnable)postError(Request<?> request, VolleyError error)

Network.java: 用于网络请求调用的接口,包含一个方法performRequest()

BasicNetwork.java: 继承了Network类,是Volley中默认使用的网络请求处理工具类。在该类里面会处理Request发送前的一系列工作,以及发送工作和发送后返回NetworkResponse的解析工作。里面真正实现网络请求的发送工作是利用了其中的mHttpStack(HttpStack.java实例)。

HttpStack.java: 网络请求接口类,包含一个方法performRequest(Request<?> request, Map<String, String> additionalHeaders)。该方法和BasicNetwork类中实现的方法performRequest(Request<?> request)不同。前者在后者的方法中被调用,来实现真正的网络请求。

HurlStack.java: 实现了HttpStack接口,在android版本在2.3之上的系统中,通过HttpURLConnection类实现网络请求。

HttpClientStack.java: 实现了HttpStack接口,在android版本在2.3之下的系统中,通过HttpClient类实现网络请求。

Cache.java: 读写缓存类的接口类,抽象出了一系列有关缓存读写的方法。

DiskBasedCache.java: 继承并实现了Cache中的一系列方法,是Volley中默认使用的缓存读写工具类。

Response.java: Volley自定义的bean类,Request通过上面实现了HttpStack接口的两种实现方法发出之后,会返回相应的NetworkResponse类实例,这个类是org.apache.http包里面的类,NetworkResponse实例返回后,解析出有用的信息,并组成Response实例。

    上面简单的介绍了Volley中的核心类,再盗用一张图orz,再次感谢上面的菊苣们。design

    上图清晰的画出了,请求从加入到队列,怎么被分步骤处理,分缓存和网络两条路径,先查询是否存在请求对应的缓存,如存在有效缓存则直接取出缓存数据返回给调用者,如不存在有效缓存则从网络获取数据,写入缓存并返回将结果返回给调用者。

    对Volley整体上的简单介绍就先到这里了,后面会将阅读源码时候的笔记整理之后再和大家分享。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值