使用请看http://blog.youkuaiyun.com/wfeii/article/details/73141230
介绍
-
什么是Volley
Volley是一个HTTP的开源库,目的是让App的网络请求更容易,更迅速。 -
能干什么
Volley一般用于数据量小,而频繁的数据请求。 -
不能干什么
Volley不适合大型的下载或者流操作,在解析的时候会把网络请求的响应保存到内存中,会导致内存使用过大。
整体结构
-
对外接口Volley,使用Facade封装内部实现,只提供便捷的方法
-
Request,封装请求数据和请求响应的解析
-
Cache,缓存请求返回的数据
-
Network,网络请求的分发与真正的网络请求
-
Response,返回的请求数据
-
Error,对于请求的异常,Volley封装成自定义的Error,减少错误逻辑,保证正常干净。
-
网络底层API,现在基本使用HttpURlConnection来请求
-
对于Cache的缓存,使用了文件保存
实际编写代码时候对外接口采用Facade模式,一方面可以隐藏内部接口的复杂性,另一方面也保证了对外接口的易用性。
面向接口
Request
每一次的网络请求都会创建一个Request对象。
-
Request封装了网络请求的数据,而且封装了网络响应的解析接口,网络响应的分发接口
- parseNetworkResponse(NetworkResponse) : Response
- parseNetworkError(VolleyError) : VolleyError
- deliverResponse(T response) : void
- deliverError(VolleyError) : void
-
Request的网络响应的数据采用泛型,而子类来具体化,比如StringRequest是把网络响应的数据封装成String,JsonObjectRequest返回JSONObject对象。
实际代码中我么可以学习一下泛型的方式,提高代码的设计。
Cache
Cache缓存网络的响应数据。
- CacheDispathcer用与获取缓存数据和Request的分发,缓存能获取直接返回,否则从网络中获取。
- Cache接口封装了一般性的缓存的方法,当我们设置了不使用缓存机制的时候,将使用NoCache。
- Entry缓存的bean类。
实际代码中我们可以使用Cache接口的方式,对于没有缓存机制的时候可以使用NoCache,这样可以避免标识的变量到处传递。还有一下null的判断,类似的也可以使用NullObject来代码判断为null。
NetWork
Network负责真正的网络请求
- NetworkDispatcher用于分发Request,如果有缓存,让CacheDispather处理。
- ResponseDelivery主要分发支付结果,比如子线程到主线程
- Network接口与HttpStack使用策略模式进行组织,对于Volley底层使用Okhttp,可以实现HttpStack来实现。
if (stack == null) {
if (Build.VERSION.SDK_INT >= 9) {
stack = new HurlStack();
} else {
// Prior to Gingerbread, HttpUrlConnection was unreliable.
// See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}
实际代码中,策略设计模式来提高代码的扩展性。
Response
ResponseDelivery分发支付结果,而ExecutorDelivery主要用于把网络响应的数据从工作线程传递到UI线程中。ExecutorDelivery其中依赖ResponseDeliveryRunnable,主要是主线程的Handler来post一个Runnable。Response是封装的网络响应。
这段代码可以在实际中抽出来用于线程向主线的传递数据。
##思考
- StringRequest支持表单的方式请求,而如果我以其他的方式请求网络,就必须继承StringRequest,实现自己的方式,是否我们可以把请求的body抽象出来创建接口RequestBody,实现不同请求方式,只需要替换相关的RequestBody,提高扩展性。
单元测试
- 怎么样才具有可测性?
- 测试哪些内容?
面向接口
要想代码有可测性,需要面向接口编程,依赖关系尽量依赖接口,这样依赖的接口就可以mock,使得测试逻辑可以书写。
以Volley的ResponseDeliveryTest为例,实际测试ExecutorDelivery的逻辑。
-
ExecutorDelivery主要依赖Request,Response,需要先Mock
-
ExecutorDelivery的测试小技巧,引入Executor,便于测试,而且提供了便于测试的构造函数
Notice:
依赖注入,接口中创建了某个对象,尽量另行创建一个方法去创建对象。
逻辑问题
- 测试内容以逻辑判断为主,对于赋值,取值的方法不需要测试。
- 测试认为是可能出错的代码,不是所有的代码都需要测试,这样能够达到测试的书写的回报更高。
开源库源码分析
短时间,高质量的分析开源库,并能为我所用呢?思考题
编程技巧
- Exception统一处理,这样代码正确的流程就更清晰,比如Volley中VolleyError采用的是对于异常封装自己的异常然后再做处理。
- 网路请求封装使用File缓存,慎用内存缓存。
- Facade模式封装子系统,对外只提供必要的接口。
- 模块化,标准化,我们写代码中尽量通用模块不依赖具体的逻辑,这样下次做项目有类似的需求我们就可以直接拿来使用。