volley 框架剖析(一) 面向接口的编程

Volley是Google出品的一个轻量级的网络框架,默认实现,主要用于小数据量的网络请求。这里就按从粗到细,自上而下的过程,给大家剖析这个牛X的框架。

这个框架的代码量虽少,但却把面向接口的编程这个原则发挥的淋漓尽致。这个框架是怎么构成的呢?

先看包的结构。

有com.android.volley 及 com.android.volley.toolbox两个包。

其中com.android.volley中的接口和类,是基础框架,构成了一个基于队列的网络请求功能。

而com.android.volley.toolbox这个子包,则是对框架的一些默认实现,和基本功能的扩展。

先看下面一个粗略的类关系图,列出了几个比较重要的接口与类。

我们着重研究图的上半部分,即下图中红色框住的部分,它是volley的最基础框架。

这几个类和接口都是在com.android.volley中,他们搭建了一个最基础的网络框架。

RequestQueue,是整个框架的核心类之一,它既是volley框架对外使用的api,也包含所有基础的接口。在这里,它与其他类是一种组合关系。

我们看到,这个类中包含了多个以Request为类型的集合(用以存储多个网络请求以及相关去重,优先级等),一个继承了Cache接口的实例,一个具备Network能力的实例,一个ResponseDelivery能力的实例,以及两个Dispaher。

Request的集合,包括一个HashMap mWaitingRequests,主要用于请求时进行去重处理。

HashSet mCurrentRequests ,主要用于保存所有的请求对象。

PriorityBlockingQueue,两个优先级阻塞队列,用于保存将要进行处理的请求。这里注意的是这个队列是自带排序功能,因为每一个Request对象都是可Comparable的,通过每次加入时进行比较Priority来排序。

Cache接口,主要有get和put两个方法,用于实现缓存。默认在子包中实现了两种方式的缓存,无缓存(NoCache)及磁盘缓存(DiskBasedCache),如果这两个自带的缓存不能实现我们的需求,则可自行继承这个接口来扩展新的Cache策略。

Network接口,唯一一个方法输入request,输出NetworkResponse, 默认的子包中实现了一个BaseNetwork(基于HTTP的能力),同样,如果不满足HTTP的协议,则自行继承这个Network接口来实现。

两个Dispather很类似,CacheDispatcher是单线程处理,这里为什么要用线程呢,因为存取缓存可能会涉及到IO操作,可能会阻塞,因此,这里使用了一个线程来处理。在CacheDispatcher中也包含了两个优先级阻塞队列,一个可缓存队型,一个网络队型。在运行时,首先从可缓存队列中take一个请求,如发现是已有缓存的,则直接处理,否则就塞入到网络队型去处理(交给NetworkDispatcher)。

NetworkDispacther默认开启4个线程来处理(构造RequestQueue对象时可以修改),整个网络请求都在run中完成,主要是调用 Network接口的performRequest方法来实现通信。

ResponseDelivery主要用于把结果通知出去,默认的实现有一个ExecutorDelivery。

经过分析,我们发现这个volley的设计是相当灵活的。它灵活运用了设计模式中的策略模式,对于一些可变的行为,都统一使用接口,并不去关心具体用什么实现,把实现交给使用者去定义,非常符合“对修改关闭,对扩展开放”的设计原则。

由于volley对一些细节处理的非常完善,后续我们会有针对性的介绍每一个类的实现,及为什么

时间: 2024-10-11 17:58:29

volley 框架剖析(一) 面向接口的编程的相关文章

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)  (1)框架搭建    (2):数据库访问层的设计Demo 前言:这篇博客在数据访问层的基础上面我们继续学习对这个Demo的开发,希望大家都好好理解一下这个Demo的架构,到最后我实现权限的时候我就简单的说一下搭建过程就OK了,因为这个Demo的思想就是按照权限的设计方式去设计的,下面我们开始介绍面向接口的编程思想,如果感觉好的话可以

基础才是重中之重~再说面向接口的编程

之前在我的文章中有对接口进行过讲解,但感觉讲的还是不够清晰,不够利针见血,这次我把面向接口的编程里,自认为比较核心的两点说一下: 接口详细介绍请看我的这篇文章 基础才是重中之重~为什么C#有显示实现接口 一切依赖于抽象,而不是实现 多个接口相同的行为,被一个对象实现 #region 多个接口相同的行为,被一个对象实现(一切依赖于抽象,而不是实现) interface IPainter { void Draw(); } interface ICowBoy { void Draw(); } clas

Mybatis面向接口式编程

Mybatis面向接口编程 1.xml文件书写格式 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="co

Volley框架剖析( 二)从开始到结束

上一篇中,我们分析了Volley的一个总体组成.今天我们继续分析Volley的一个数据流走向,即从初始化到发起请求,再到请求结束的一个流程. 先看初始化. Volley的初始化,实际上就是返回一个RequestQueue的队列.在Volley中调用.一个最简单的创建方式即有一个Context即可. /** * Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it. *

volley 框架剖析(三) Request类精解

Request是所有网络请求的基类,它实现了Comparable接口,前面提到RequestQueue可按照优先级队进行排序,这里的Comparable就是为优先级排序作准备. 接下来,我们对Request中比较重要或有趣的成员或方法进行一一解释. Request中包括一个对支持的Http方法的定义.这里使用的内部接口而不是枚举来实现的. public interface Method { int DEPRECATED_GET_OR_POST = -1; int GET = 0; int POS

volley 框架剖析(四) 之HTTPCache设计

记得有位高人说过,成功在于细节.同样,一份代码质量如何,同样也在于对细节的处理上.考虑的情况越多,则出现问题的概率也就越低. Cache之前也写过,但看了Volley的Cache之后,真心觉得差距大了.不废话了,还是上大餐吧 public static class Entry { /** The data returned from cache. */ public byte[] data; /** ETag for cache coherency. */ public String etag;

面向接口的开发到面向对象的编程

估计看到这个博文名字会有很些人懵逼,其实懵逼是正常的,因为刚听到这个名字我也是出于懵逼状态,也是看过类似的博文之后才有了那么点点的了解. 一.面向接口的编程 面向接口的编程目的是为了更好的代码扩展,因为对于java语言而言允许向上转型. 二.面向对象的开发 对于java世界而言,所有现实中的和非现实的事物一切都是可以抽象化的,万物皆对象. 如何抽象化接口为java中的对象? 接口包含了接口和抽象类,那么这里最终我们最关心的其实还是抽象方法.那么我们是否可以把方法看到一个对象?姑且可以,那么我们方

面向接口可扩展框架

Asp.net 面向接口可扩展框架之核心容器(含测试代码下载) 新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫“核心容器”. 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘回答一下) 解读一下:类是个体的定义(建模), 个体的每一方面都可以是一个接口 说白点,其一接口可以代表对象(类)一个方面,再说透点对象可能是多面手(继承多个接口),能在不同场景(作为不同接口的实例)下正常工作 其二每个接口可以有不同实

面向接口编程

系列——MEF实现设计上的“松耦合”(终结篇:面向接口编程) 序:忙碌多事的八月带着些许的倦意早已步入尾声,金秋九月承载着抗战胜利70周年的喜庆扑面而来.没来得及任何准备,似乎也不需要任何准备,因为生活不需要太多将来时.每天忙着上班.加班.白加班,忘了去愤,忘了去算计所谓的价值.天津爆炸事故时刻警示着我们生命的无常,逝者安息,活着的人生活还得继续,珍惜生命,远离伤害.武汉,这座炙热的城市,虽值金秋,却依然经受着“秋老虎”的烘烤,马路上蒸腾的热气迎面袭来,全身毛孔张开,汗流不止,在这般高温下,似乎