Volley源码解析

Volley 是 Google 2013年推出的 Android 异步网络请求框架和图片加载框架。主要适用于数据量小,但通信频繁的网络请求(移动端的网络请求多为这种类型)。

Volley的使用非常简单,首先通过调用Volley的静态方法newRequestQueue获得并开启一个请求队列,然后创建一个Request对象,将该Request对象加入到请求队列中便可以执行网络请求了,然后可以通过监听Response类中的Listener和ErrorListener获得请求结果。

Volley框架中数据结构:

  1. 队列:一个网络请求队列(PriorityBlockingQueue)、一个缓存队列(PriorityBlockingQueue,存储Cache对象)和一个等待队列(Map<String, Queue<Request<?>>>),网络请求队列用于存放网络请求,缓存请求队列用于存放缓存请求,而等待队列则是一个用于存放可以走缓存请求的指向同一URL请求的请求队列,其键为cacheKey,值为cacheKey相同的请求构成的队列(cacheKey其实就是请求的URL,所以就是相同URL请求构成的队列),也就是说Volley对指向同一个URL的请求进行了优化,通过将这些请求加入到同一个队列中,这样就可以避免重复对同一个URL发送请求,既可以提高程序效率,也可以提高内存利用率;
  2. 线程:主线程、缓存线程(CacheDispatcher)和网络请求线程(NetworkDispatcher);主线程默认为调用Volley执行网络请求的activity所在的main线程,缓存线程则用于执行从缓存队列中取出的缓存请求,网络请求线程负责执行从网络请求队列中取出的网络请求;这三个线程的切换由ResponseDelivery的实现类来执行,默认为ExecutorDelivery,该实现类内部封装了一个Handler,通过Handler的post方法完成线程切换;默认情况下,在我们通过requestQueue的start方法开启网络请求时,Volley会创建一个缓存线程和四个网络线程(点评:感觉这个地方可以改进一下,比如说可以根据当前机器的CPU核数来决定网络请求的个数等)

Volley网络请求的具体过程
首先获取一个RequestQueue对象,然后调用该RequestQueue对象的add方法将一个Request加入到这个请求队列中。在RequestQueue的add方法中,首先会判断该Request是否可以被缓存,如果不行的话,就直接将该请求加入到网络请求队列中,让其通过网络请求分发器走网络请求处理流程就好了;如果这是一个可以被缓存的请求的话,那么首先会根据该请求的URL来判断当前等待队列中是否有指向同一个URL的请求,如果有,就将该请求加入到同一URL请求所指向的队列中;如果没有,则先将该请求加入到等待队列中,然后将其加入到缓存队列中。请求被加入到不同的队列中后就会通过不同的请求分发器进行处理。

下面首先分析下缓存分发器(线程)的处理流程:缓存分发器的run方法中有一个while死循环,通过这个循环不断从缓存队列中取出请求进行处理直至遇到一个标志应该退出队列的异常(InterruptedException)。在循环内部,首先会从缓存队列中取出一个请求,如果该请求已被取消,则继续取出下一个请求进行处理;如果未被取消,则看该请求对应的响应数据是否已经缓存队列中,如果不在缓存队列中,则将该请求加入到网络请求队列中去走网络请求;如果该请求缓存命中,但是已经完全(硬)过期,也将其加入到网络请求队列中,因为硬过期的缓存数据已经不可用了;如果该请求缓存命中,且未过期,便通过ResponseDelivery从缓存线程中切换到主线程中,同时将该请求及请求结果通过响应结果分发器(ResponseDelivery)提交给主线程;如果该请求缓存命中,但是已经软过期,那么通过分发器将当前请求结果提交给主线程,同时将该请求加入到网络请求队列中,用于数据刷新。

从缓存请求队列的处理流程可以看出Google为我们提供了一个很好的编程范式:不仅对请求进行缓存,而且还将缓存结果的过期状态分为软过期和硬过期两种,这两种状态是通过Response的isExpired()方法和refreshNeeded()方法来判断,当前者为true时,为硬过期;当前者为false,而后者为true时,为软过期,软过期时Response中boolean类型的intermediate标志将被设为true;软过期的数据会先返回给用户,然后将对应的请求加入到网络请求队列中用于数据刷新;硬过期则直接将其加入到网络请求队列中。

接下来看网络请求是如何被处理的。网络请求线程的run方法首先会将该线程设为后台线程,然后也是通过一个while死循环处理请求直至遇到一个标志应该退出队列的异常或请求出错。从网络请求队列中取出一个请求后,如果该请求被取消则继续处理下一个请求;否则通过NetWork的performRequest方法具体执行网络请求,取出请求结果。如果请求结果响应码为304并且该结果已经提交给用户了,那么继续处理下一个请求就好了;否则如果该请求可以缓存,则将结果缓存,然后再通过ResponseDelivery切换回主线程。NetWork的performRequest方法内部会根据当前系统为Android2.3以前还是以后的系统分别调用HttpClient和HttpUrlConnection执行网络请求。

缓存请求处理流程图
网络请求处理流程图

图片来源于codeKK源码分析之Volley源码解析
参考文章:http://codekk.com/open-source-project-analysis/detail/Android/grumoon/Volley%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容