您的位置:首页 > 移动开发 > Android开发

Android学习系列之Volley框架

2016-01-22 11:50 453 查看
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】/article/1562120.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: