Part0:Volley源代码分析概述

来源:互联网 发布:mysql 删除外键 编辑:程序博客网 时间:2024/06/05 09:42

    • 简介
      • Volley是什么
      • Volley的特点
    • 我们会怎么做
    • Volley总体架构
      • 总体设计图
      • 类关系图
      • 核心功能流程图

最开始的说明:Volley系列源代码分析按照章节依次讲解Volley的核心机制,一步一步的剖析,优点是每个原理独立,降低理解难度,但是缺点是缺乏整体性,大家在浏览代码时千万不要陷入细节中无法自拔,先搞清楚大致思想,浏览完整个系列文章一切都会柳暗花明

简介

Volley是什么?

  • Volley是Google官方推出的一款网络请求图片加载框架,于Google I/O 2013大会发布.
    这里写图片描述
  • 从上图中可以看出,Volley非常适合那些通信频繁,但每次通信数据量不大的场景,这正是大多数Android通信场景的写照.

Volley的特点

  • 可扩展性极强,Volley是基于接口设计的,能充分满足我们的各种需求.(可以由用户自定义request和response等)
  • 符合http规范,充分考虑各种网络传输的异常情况,全面处理statusCode(2xx,3xx,4xx,5xx),合理利用请求头和响应头的相应内容完成缓存体系的搭建(Last-Modified/if--Modified-Since,ETage/If-None-Match),并支持重试和优先级机制,极大增加了框架的灵活性
  • 网络请求异步操作,采用死循环,默认开启一个缓存线程和4个网络加载线程,增加效率,并且用户可以手动停止网络加载
  • 合理利用SDK版本的不同选择相应的网络请求类,最大化相应类的优点
  • 提供了简便加载图片的功能

我们会怎么做?

  • 在分析Volley的整体架构之前,我们不妨想一想如果是我们要设计一个具有上面功能的框架,我们需要考虑什么?或者说,我们需要做些什么?
    • 由于是框架,毫无疑问我们需要把扩展性放到重要的位置,所以我们要大量面向接口编程和使用抽象类,比如说,把request和response抽象出来,以便于用户继承他们实现自己特定的需求逻辑
    • 我们需要向用户暴露的接口尽可能的少,尽可能的简单,We do more,Users do less.
    • 需要大量使用网络异步操作,所以我们需要将网络执行类封装起来并在子线程中执行,同时我们还需要一个传递者,将结果很方便的从子线程中传递到主线程中,以便于我们的操作
    • 需要支持并发,我们只需要使用Java原生的支持既可以完成,比如使用相应的阻塞队列,同时我们需要考虑优先级的情况,所以毫无疑问我们会使用:PriorityBlockingQueue,同时注意锁的使用,既不能太影响效率又要辅助我们保证并发情况下的安全性,参考double lock实现思路进行优化.
    • 缓存机制的实现,一般来说我们可以使用三级缓存策略,注意和服务器端交互时缓存超时更新机制的使用(一些请求头和相应头),并且选用合适的缓存替换机制(如LRU算法,合理使用java中的软引用等等).
    • 重试机制的实现,我们可以动态的设置超时时间来解决这个问题.
    • 一些常见问题的解决,比如考虑一个网络请求队列中有多个相同的url怎么办,可以考虑使用多队列管理,总队列,网络请求队列,缓存队列,等待队列,极大的增加灵活性.

Volley总体架构

总体设计图

这里写图片描述

  • RequestQueue是一个大管家,维护了各种的request集合,两种Dispatch Thread从RequestQueue中不断取出请求去处理,根据是否已经缓存调用Cache或Network这两类接口去获取数据,并通过ResponseDelivery传递到用户的手里

类关系图

这里写图片描述

图内红色圈的部分,组成了Volley框架的核心,围绕着RequestQueue类,将各个功能点以组合的方式结合在了一起,各个功能点也都是以接口或者抽象类的方式提供,红色圈外的类在toolbox包中,作为Volley对核心的默认实现.

  • Volley的使用比较简单,通过Volley.newRequestQueue创建一个请求队列后,不断的向这个队列中add相应的请求即可.
  • 根据上面的设计图简单介绍一些重要的概念,详细的信息在后面会介绍.
    • Volley:调用Volley的入口,newRequestQueue(...)方法中根据当前SDK版本创建了合适的网络请求类,并创建了相应的磁盘缓存类,最后初始化了一个RequestQueue,并调用了它的start()方法
    • Request:用户发出的请求类,包含了向server传递的基本信息,直面用户的一个类,StringRequest,JsonRequest,ImageRequest都是它的子类,用户想要新的数据类型可以扩展此类
    • RequestQueue:相对而言最重要的类,存储着用户的request,类中维护了一个CacheDispatcher,用于处理走缓存的调度线程,一个NetworkDispatcher[],用于处理走网络请求的调度线程.类中还有ResponseDelivery,用于对返回结果的分发,通过调用RequestQueuestart()函数就会启动两个调度线程
    • CacheDispatcher:一个线程,用于调度处理走缓存的请求。启动后会不断从缓存请求队列中取请求处理,队列为空则等待,请求处理结束则将结果传递给ResponseDelivery去执行后续处理。当结果未缓存过、缓存失效或缓存不新鲜的情况下,该请求都需要重新进入NetworkDispatcher去调度处理。
    • NetworkDispatcher:一个线程,用于调度处理走网络的请求。启动后会不断从网络请求队列中取请求处理,队列为空则等待,请求处理结束则将结果传递给ResponseDelivery去执行后续处理,并判断结果是否要进行缓存。
    • ResponseDelivery:返回结果分发接口,目前只有基于ExecutorDelivery的在入参handler(程序中用于从子线程向主线程分发)对应线程内进行分发。
    • HttpStack:处理Http请求返回请求结果。目前Volley中有基于HttpURLConnection的HurlStack和基于Apache HttpClient 的HttpClientStack
    • Network:调用HttpStack处理请求,并将结果转换为可以被ResponseDelivery处理的NetworkResponse
    • Cache:缓存请求结果,Volley默认使用的是基于sdcard 的DiskBasedCache。NetworkDispatcher得到请求结果后判断是否需要存储在Cache中,如果需要,CacheDispatcher会从Cache中取缓存结果。

核心功能流程图

这里写图片描述

  • 上图已经将Volley请求的过程描述的很清楚了,主线程,缓存调度线程和网络请求线程都是基于RequestQueue进行交互管理的,达到了解耦的效果,又非常方便做统一处理
2 0
原创粉丝点击