您的位置:首页 > 移动开发 > Android开发

android-----我眼中的Volley

2016-07-25 11:48 281 查看
        这几天,为了面试,计划把自己看过的一些开源框架知识以一种非代码的形式描述一下,以便适合和面试官聊,这篇要聊的是Volley框架,如果你没看过Volley源码的话,建议你先去看看相关文章再来阅读本文;

        Volley框架是用于网络请求的,他适用于频繁的小数据网络请求,对于post大文件的情况,他显得有点无能为力了;

       
Volley中存在三种队列,缓存队列,网络请求队列以及同一url请求的等待队列组成的map集合,存在三种类型的线程,主线程,缓存线程,网络请求线程,主线程与缓存线程以及网络请求线程的切换工作是由ResponseDelivery请求数据分发器实现的,他里面封装了Handler,默认情况下在我们创建RequestQueue对象的时候就会创建一个缓存线程和4个网络请求线程,其中缓存线程主要是用于操作缓存队列的,网络请求线程主要是用于操作网络请求队列,而同一url请求的等待队列组成的map集合是Volley为我们做的一点优化,主要是为了避免对同一url请求的多次请求重复执行的情况发生,比如有三个同一url的请求进来了,他只需要执行第一个便可以了,剩下的两个只需要等待第一个执行结束之后拿到值就可以了,有点类似于过滤器的作用,因而他是使用map实现的;

        当我们通过各种Request的子类创建出Request添加到RequestQueue中的时候,他会选择到底是加入到缓存队列还是网络请求队列中,如果当前请求不允许缓存的话,则直接将其加入到网络请求队列中;如果允许缓存的话,则首先会判断同一url请求的等待队列组成的map集合中是否存在当前url的请求的缓存记录,存在的话会将当前请求加入到指定url请求对应的request链表中,并且更新map集合中该url请求对应的request链表,如果之前在同一url请求的等待队列组成的map集合中并不存在当前url的请求缓存链表记录的话,则将当前请求添加到缓存队列中,这样的话请求就已经到了缓存队列或者网络请求队列或者同一url请求的等待队列组成的map集合中了;

        接下便是对请求的处理过程了,分为缓存线程的处理过程和网络请求线程的处理过程,但是两者是类似的,先来说说缓存线程的处理过程,他的run方法里面是一个while死循环,会不断的从缓存队列中取出请求来执行,在得到请求之后首先会查看缓存中是否有对应于该请求的数据存在,不存在的话会直接将当期请求加入到网络请求队列中,接着去缓存队列中拿下一个请求;如果缓存中存在当前请求的数据,则会判断当前缓存是不是硬过期,这里不得不说下Volley在缓存方面的出色地方,他并不会将缓存过期一概的认为是一个级别的,他将缓存过期分为了硬过期和软过期,对于硬过期他会直接将请求添加到网络请求队列中执行,因为硬过期的缓存将不再会被使用;如果缓存没有硬过期,并且也没软过期,则会通过ResponseDelivery将线程切换到主线程,并且将缓存数据传回,在主线程进行界面元素的修改;如果没有硬过期但是软过期了,那么这次请求是会有两次返回的,第一次是返回缓存数据,在返回缓存数据之后会将当前请求加入到网络请求队列中,因此第二次是返回网络请求的数据,这点很符合我们平常使用软件的流程的,刚刚进入页面先展示缓存数据,然后再刷新页面,这样用户体验度比较好啦;

       
接下来便是网络请求线程的处理过程了,在他的run方法里面同样存在一个while死循环,用来不断的从网络请求队列中取出请求执行,在取到请求之后首先会判断当前请求是否被暂停掉,如果被暂停了的话直接取消当前请求,从请求队列中取出下一个请求处理;接着会通过网络请求的方式来执行Request请求,可以通过HttpUrlConnection或者HttpClient两种方式来实现,在得到Request请求的Response返回结果之后进行适当的处理,如果当前请求允许缓存的话,则将返回结果缓存下来,同时通过ResponseDelivery请求数据分发器切换到主线程将返回结果返回主线程进行界面元素的适当操作;

        以上便是Volley处理网络请求的整个流程了,我们说到了Volley中用到了硬过期和软过期,具体来说是通过设置Request头部的"cache-hit-expired"(硬过期)/"cache-hit-refresh-needed"(软过期)来实现的:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息