您的位置:首页 > 理论基础 > 计算机网络

SimpleNet网络框架源码分析

2016-06-27 16:37 393 查看

项目介绍

  SimpleNet是何红辉开源的一个http网络请求库。该库借鉴了volley的实现思路,但为了更易于理解,裁掉了一些模块。整体适合学习http网络框架原理使用,难易度恰到好处。在此基础上再去读volley源码,会体悟更深刻一些。

特点

支持httpclient、httpurlconnection两种方式

支持成功的回调

请求:

支持多种格式的请求:Json、String、小文件

支持多种协议的网络请求:POST\PUT\GET\DELETE

支持对请求做取消

支持请求设置优先级属性

支持请求队列,支持多个请求并发

对请求结果支持内存缓存

总体设计



  SimpleNet框架的基本结构类似于Volley,包括一些命名上也有跟Volley一致。它主要分为四个部分,最上面的部分为Request,即各种请求类型。例如返回的数据类型为json的对应为JsonRequest,返回数据字符串的为StringRequest,如果需要上传文件,那么你需要使用MultipartRequest,该请求只支持小文件的上传,如果上传的文件过大则会产生OOM。

  第二部分为消息队列,消息队列维护了提交给网络框架的请求列表,并且根据相应的规则进行排序。默认情况下更具优先级和进入队列的顺序来执行,该队列使用的是线程安全的PriorityBlockingQueue,因为我们的队列会被并发的访问,因此需要保证访问的原子性。

  第三部分是Executor,也就是网络的执行者。该Executor继承自Thread,在run方法中循环访问第二部分的请求队列,请求完成之后将结果投递给UI线程。为了更好的控制请求队列,例如请求排序、取消等操作,这里我们并没有使用线程池来操作,而是自行管理队列和Thread的形式,这样整个结构也变得更为灵活。

  第四部分则是Response投递类,在第三部分的Executor中执行网络请求,Executor是Thread,但是我们并不能在主线程中更新UI,因此我们使用ResponseDelivery来封装Response的投递,保证Response执行在UI线程。

  每个部分职责都相对单一,这样便于日后的升级和维护。

  这里采用的不是分层的思想,而是模块化的思想

类图



不是分层,是模块化

流程分析:栈帧+时序图





以上只是主线程的栈帧分析。

核心模块分述

Request类

  Request类这里使用的是命令模式,Request类似一个Command类,提升了扩展性,也降低了请求和请求处理者之间的耦合度。

  对于网络请求来说,用户得到的请求结果格式是不确定的,比如有的服务器返回的是json,有的返回是xml,有的直接是字符串。但是,对于Http Response来说,它的返回数据类型都是Stream,也就是我们得到的原始数据都是字节流。所以在request基类中我们必须预留方法来解析response返回的具体类型,虽然返回的类型不同,但是处理的逻辑是一样的。

  扩展一个请求类非常简单,只需要覆写parsePrsponse函数来转换为具体的类型就可以了。比如后面我想使用这个框架来做一个ImageLoader,那么我可以创建一个ImageRequest,该请求返回的类型就是Bitmap,那么我们只需要覆写parsePrsponse函数,然后把Response的数据转化为Bitmap即可。

Response类

  每个请求都对应一个Response,Response类是Http响应报文的表示,它存储了请求的状态码、请求结果等内容。

我们都知道,Http实际上是基于tcp协议,而tcp协议又是基于socket,socket实际上操作的也就是输入、输出流,输出流是向服务器写数据,输入流是从服务器读取数据。因此,我们在Response类中应该使用InputStream存储结果或者使用更为易于使用的字节数组。

请求队列

  网络请求队列实际上就是在内部封装了一个优先级队列,在构建队列时会启动指定个数的NetWorkExecutor来从请求队列中获取、执行请求。

NetWorkExecutor网络执行器

  用户需要创建并启动一个请求队列之后,指定个数的NetWorkExecutor将会随之启动。这多个NetWorkExecutor共享一个消息队列,在各个NetWorkExecutor的run函数中循环地取请求队列中的请求,拿到一个请求之后通过HttpStack对象来真正的执行请求,最终将请求结果通过ResponseDelivery分发给UI线程。

并且在这里面做了缓存的处理和判断。这里只是实现了二级缓存。

网络执行请求接口-HttpStack

ResponseDelivery

将请求结果回调到UI线程中

阅读体会&优缺点

牛逼的框架总是能给人很多启发,令人如沐春风。代码总是优雅而简洁。比如单一职责原则,各种设计模式的混合使用,多聚合少继承,通体都是OO思想的经典的运用。

SimpleNet类似Volley,因为有内存缓存,所以不适合请求大文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: