Volley概述
Volley是Google 2013年I/O大会推出的H针对Android的HTTP网络请求框架,让网络请求更简单,更快!
特点
- 自动调度网络请求
- 支持并发网络连接
- 支持标准的HTTP缓存协议
- 支持请求优先级设置(4级)
- 支持取消单个或多个请求
- 易于定制,扩展性强。比如Retry&Backoff机制
- 强大的网络请求能力让你轻松的发送异步请求来填充UI数据
- 提供调试和跟踪工具
优点
擅长将RPC(远程过程调用协议,C/S模式)类型的操作,用来展示服务器数据。比如以某种数据格式获取一页搜索结果。支持任意的数据传输格式,比如图片,字符串,json,你也可以定义自己的数据格式。其实就是自定义Request。Volley呢,让你不再写这些重复的模板代码(网络请求逻辑,不再重复造轮子),这样你就可以专注于你应用本身的业务逻辑.
- 缺点
由于Volley都是在内存中解析和处理数据,所以不适合大数据量的下载操作。如果需要下载大文件,可以考虑使用系统的DownloadManager或者自定义HttpStack。
RequestQueue 请求队列
通过Volley.newRequestQueue获取默认配置的消息队列。
创建请求:new StringRequest(...).setTag(TAG);
添加请求:queue.add(stringRequest);
取消请求: mRequestQueue.cancelAll(TAG);
配置RequestQueue
// Instantiate the cache
Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap
// Set up the network to use HttpURLConnection as the HTTP client.
Network network = new BasicNetwork(new HurlStack());
// Instantiate the RequestQueue with the cache and network.
mRequestQueue = new RequestQueue(cache, network);
// Start the queue
mRequestQueue.start();
RequestQueue启动后,会开启一个CacheDispatcher和默认4个NetworkDispatcher。
DiskBasedCache用来给CacheDispatcher存取http缓存response,
BasicNetwork用来给NetworkDispatcher发起Request
BasicNetwork初始化的时候需要设置HTTP 客户端。volley中默认提供HttpUrlconnection(api>=9)和HttpClient两种选择
自带Request
StringRequest,ImageRequest,JsonRequest(JsonObjectRequest,JsonArrayRequest)
ImageRequest
发送图片请求,包含图片输入流的解析操作。
ImageLoader:图片加载帮助类,针对批量请求相同URL的ImageRequest做了合并处理,并增加了缓存的处理,对外暴露缓存接口,可自定义缓存方式。
NetworkImageView:ImageView的子类,通过外部提供的ImageLoader,扩展了加载网络图片的功能
自定义Request
继承Request类,实现deliverResponse和parseNetworkResponse两个抽象方法
public class GsonRequest<T> extends Request<T> {
private final Gson gson = new Gson();
private final Class<T> clazz;
private final Map<String, String> headers;
private final Listener<T> listener;
/**
* Make a GET request and return a parsed object from JSON.
*
* @param url URL of the request to make
* @param clazz Relevant class object, for Gson's reflection
* @param headers Map of request headers
*/
public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,
Listener<T> listener, ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.clazz = clazz;
this.headers = headers;
this.listener = listener;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return headers != null ? headers : super.getHeaders();
}
@Override//处理解析出的response
protected void deliverResponse(T response) {
listener.onResponse(response);
}
@Override//实现原始NetworkResponse的解析工作
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String json = new String(
response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(
gson.fromJson(json, clazz),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
}
}