前言
本来公司项目的网络请求框架是基于volley框架的,由于前阵子项目功能扩展和服务端接口跟新变动,导致volley已经不能满足需求,所以考虑自己封装网络库,缓存部分直接拷贝的volley缓存模块的源码(这也得益于volley的高扩展性)。自己封装库更加符合需求,也学到了很多东西,再次记录下。
心得
也分享一点看源码的心得吧,总结下来几点:
- 熟悉基本的API调用:作用是熟悉几个核心的类,类之间的依赖关系,弄清楚几个类的职责、主要的属性、方法。
- 随着API调用的顺序,走通源码的主线的调用流程
- 画出流程图、模型图
- 画出类图,总结出类的职责
- 各个模块的深入理解,理解作者的设计思想
Volley的优点
- 面向接口编程,高扩展性。
- 回调在主线程,不需要进行线程切换
- 支持请求优先级、请求的取消
- 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
缺点
- volley不适合上传下载大量文件,volley的request和response都是把数据放到byte数组里,不支持输入输出流
- 特别适合数据量小,通信频繁的网络操作。
- 不支持https请求,但是可自行扩展。
- 不支持401错误码。只考虑了statusCode(statusCode < 200 || statusCode > 299的情况
这些优缺点会在具体源码分析的时候分析。
1、 Volley的使用
mQueue = Volley.newRequestQueue(this);
StringRequest request = new StringRequest(Request.Method.GET, mBaseUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.e("StringGet()", "response = " + response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
mQueue.add(request);
这是一个用volley实现一个最基本网络请求需要这几步:1、创建一个请求列队 2、创建一个Request对象,包装具体的请求数据、回调等信息。3、将Request加入请求列队。在这里我们好像只是看到了将请求加入了队列并没有去提交相应的任务,这个就是volley的任务调度器的作用,这个稍后说。
2、volley的类图:
(图片出自 coodkk 自己也画了个,没画好,直接用了)
3、volley的模块
volley总的来说可以分为上图几个模块
- NetWork:用来具体的http请求,高度扩展,可以扩展HttpUrlConnecion、HttpClient、Okhttp
- 缓存Catch:按照HTTP缓存机制缓存到磁盘,有过期和新鲜度的检查
- 调用器:有两类调度器,一种是缓存调度器,从缓存列队中不断去取请求,如果有缓存,直接交给分发器处理,如果没有,将请求丢到NetWork请求列队,进行网络请求
- 分发器:实现网络请求完后的线程切换,将回调结果切换到主线程,方便更新UI
Volley的功能点
- 不同的Request返回不同的数据,从服务器拉取数据后,数据解析的工作交给具体的Request处理,每个Request的子类都自己的解析方式,自己也可以进行扩展
- 重试策略
- 取消请求
- 请求优先级
- 异常的处理
- 地址重定向处理
- 缓存
具体细节放在源码分析中