赞
踩
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类似一个Command类,提升了扩展性,也降低了请求和请求处理者之间的耦合度。
对于网络请求来说,用户得到的请求结果格式是不确定的,比如有的服务器返回的是json,有的返回是xml,有的直接是字符串。但是,对于Http Response来说,它的返回数据类型都是Stream,也就是我们得到的原始数据都是字节流。所以在request基类中我们必须预留方法来解析response返回的具体类型,虽然返回的类型不同,但是处理的逻辑是一样的。
扩展一个请求类非常简单,只需要覆写parsePrsponse函数来转换为具体的类型就可以了。比如后面我想使用这个框架来做一个ImageLoader,那么我可以创建一个ImageRequest,该请求返回的类型就是Bitmap,那么我们只需要覆写parsePrsponse函数,然后把Response的数据转化为Bitmap即可。
每个请求都对应一个Response,Response类是Http响应报文的表示,它存储了请求的状态码、请求结果等内容。
我们都知道,Http实际上是基于tcp协议,而tcp协议又是基于socket,socket实际上操作的也就是输入、输出流,输出流是向服务器写数据,输入流是从服务器读取数据。因此,我们在Response类中应该使用InputStream存储结果或者使用更为易于使用的字节数组。
网络请求队列实际上就是在内部封装了一个优先级队列,在构建队列时会启动指定个数的NetWorkExecutor来从请求队列中获取、执行请求。
用户需要创建并启动一个请求队列之后,指定个数的NetWorkExecutor将会随之启动。这多个NetWorkExecutor共享一个消息队列,在各个NetWorkExecutor的run函数中循环地取请求队列中的请求,拿到一个请求之后通过HttpStack对象来真正的执行请求,最终将请求结果通过ResponseDelivery分发给UI线程。
并且在这里面做了缓存的处理和判断。这里只是实现了二级缓存。
网络执行请求接口-HttpStack
将请求结果回调到UI线程中
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。