1.功能介绍
1.1 volley
Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架
1.2 volley主要特点
(1). 扩展性强。Volley 中大多是基于接口的设计,可配置性强。
(2). 一定程度符合 Http 规范,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的处理,请求头的处理,缓存机制的支持等。并支持重试及优先级定义。
(3). 默认 Android2.3 及以上基于 HttpURLConnection,2.3 以下基于 HttpClient 实现,这两者的区别及优劣在4.2.1 Volley中具体介绍。
(4). 提供简便的图片加载工具。
1.3 总体设计图
1.4 volley中的概念
Volley的调用比较简单,通过newRequestQueue()函数新建并启动一个请求队列RequestQueue后,只需要往这个RequestQueue不断的add ReQuest即可。
Volley:Volley 对外暴露的 API,通过 newRequestQueue(…) 函数新建并启动一个请求队列RequestQueue。
Request:表示一个请求的抽象类。StringRequest、JsonRequest、ImageRequest都是它的子类,表示某种类型的请求。
RequestQueue:表示请求队列,里面包含一个CacheDispatcher(用于处理走缓存请求的调度线程)、NetworkDispatcher数组(用于处理走网络请求的调度线程),一个ResponseDelivery(返回结果分发接口),通过 start() 函数启动时会启动CacheDispatcher和NetworkDispatchers。
CacheDispatcher:一个线程,用于调度处理走缓存的请求。启动后会不断从缓存请求队列中取请求处理,队列为空则等待,请求处理结束则将结果传递给ResponseDelivery去执行后续处理。当结果未缓存过、缓存失效或缓存需要刷新的情况下,该请求都需要重新进入NetworkDispatcher去调度处理。
NetworkDispatcher:一个线程,用于调度处理走网络的请求。启动后会不断从网络请求队列中取请求处理,队列为空则等待,请求处理结束则将结果传递给ResponseDelivery去执行后续处理,并判断结果是否要进行缓存。
ResponseDelivery:返回结果分发接口,目前只有基于ExecutorDelivery的在入参 handler 对应线程内进行分发。
HttpStack:处理 Http 请求,返回请求结果。目前 Volley 中有基于 HttpURLConnection 的HurlStack和 基于 Apache HttpClient 的HttpClientStack。
Network:调用HttpStack处理请求,并将结果转换为可被ResponseDelivery处理的NetworkResponse。
Cache:缓存请求结果,Volley 默认使用的是基于 sdcard 的DiskBasedCache。NetworkDispatcher得到请求结果后判断是否需要存储在 Cache,CacheDispatcher会从 Cache 中取缓存结果。
1.5 请求流程图
1.6 Volley的基本用法
上面哪些都是理论的知识,现在我们来进行实战的操作,首先要下载好volley的jar包。(可以自行去github下载,导入eclipse里面,然后导出成jar包就好了。)
1.6.1 StringRequest的用法
1. 创建一个RequestQueue对象。
2. 创建一个StringRequest对象。
3. 将StringRequest对象添加到RequestQueue里面。
//定义一个请求队列mQueue
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
//接下来弄一个Request的请求对象
//new出了一个StringRequest对象,StringRequest的构造函数需要传入三个参数,第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调
StringRequest stringRequest = new StringRequest("http://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
//将request的请求对象加载到之前的请求队列里面去了
mQueue.add(stringRequest);
因为volley是要用到网络的,所以需要在AndroidManifest.xml中添加权限
<uses-permission android:name="android.permission.INTERNET" />
1.6.2 JsonRequest的用法
jsonRequest的用法,类似于stringRequest,但是由于是一个抽象类,因此我们无法直接创建它的实例,于是只能从子类入手了。JsonRequest有两个子类,jsonObjectRequest和jsonArrayRequest..一个是请求一段json数据的,一个是请求一段json数组的。
用法差不多:
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
"http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101010100",
null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("TAG1", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
Log.d("TAG1", error.getMessage(), error);
}
});
mQueue.add(jsonObjectRequest);
返回的从代码中看,也可以看出来,是jsonobject格式,之后只要从这个格式取出来
相应需要的数据就好了
1.6.3 imageRequest
1.6.4 Imageloader
自己的感受:
反正折腾了一下Volley这个框架,对我的感受就是:
首先就是创建一个RequestQueue的队列,里面包含一个CacheDispatcher(用于处理走缓存请求的调度线程)、NetworkDispatcher数组(用于处理走网络请求的调度线程),一个ResponseDelivery(返回结果分发接口),通过 start() 函数启动时会启动CacheDispatcher和NetworkDispatchers。
接着有相关的Request的请求。分为StringRequest,ImageRequest,还有JsonRequest,还有自定义类型。
最后将Request请求,加入到最开始创建的这个队列里面。然后队列通过判断,是进入缓存cache里面还是直接通过网络进行获取。
参考资料:
【1】http://www.open-open.com/lib/view/open1427774686443.html
【2】http://blog.youkuaiyun.com/guolin_blog/article/details/17482095