Volley源码之使用方式和使用场景详解源码之使用方式和使用场景详解
概述概述
Volley是Google在2013年推出的一个网络库,用于解决复杂网络环境下网络请求问题。刚推出的时候是非常火的,现在该项
目的变动已经很少了。项目库地址为https://android.googlesource.com/platform/frameworks/volley
通过提交历史可以看到,最后一次修改距离今天已经有一段时间了。而volley包的release版本也已经很久没有更新了。
author JeffDavidson<jpd@google.com> SunMar1316:35:592016+0000虽然很久没有更新了,Volley始终是一个很好的网络
框架,我们来分析一下volley的源码,更好的了解volley的使用场景,设计模式,还有存在的一些小问题,或者说使用不当出
现的问题。
创建创建RequestQueue
下面的代码片段展示了建立一个RequestQueue需要的步骤:
// 使用 cache 和 network初始化 RequestQueue
mRequestQueue = new RequestQueue(cache, network);
// 启动队列
mRequestQueue.start();
String url ="http://www.example.com";
// 明确描述请求(request)并处理响应(response)
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// 处理响应信息
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// Handle error
}
});
// 添加request 到 RequestQueue.
mRequestQueue.add(stringRequest);
// ...
Volley类实质上只提供了一个方法newRequestQueue,用来创建RequestQueue,RequestQueue是volley的请求队
列,mCurrentRequests中存储了执行中的和将要执行的请求,DEFAULT_NETWORK_THREAD_POOL_SIZE是一个常量4。
可以通过RequestQueue的publicRequestQueue(Cachecache,Networknetwork,intthreadPoolSize)这个方法修改线程数量,默
认开启4个线程,然后一直子后台运行。这里需要注意一下在调用Volley的RequestQueue的时候,内部已经调用了
RequestQueue的start方法,不需要再次调用。如果自己创建RequestQueue需要自行调用start方法,整个APP的生命周期中
使用一次即可。多次调用会增加线程开销,每次调用start方法,都会调用stop方法终止原来的线程,然后重新开启新的线程。
正常使用volley后台请求线程数量是固定的,默认4个并发不需要修改,可能是基于这个考虑,并没有使用Executor线程池,
线程池的考虑本身是为了管理线程频繁创建,避免过多开销的。默认始终4个线程,不存在过度开销问题。个人感觉这里使用
线程池会更好一些,当然引入线程池复杂度一定会增加。始终只有4个线程也引发了一些问题,使volley在某些场景不适用。
如果请求服务器响应时间太长,4个线程都会处于阻塞状态,这个时候新来的请求只能等待,不能直接执行。volley是比较适
合轻量级请求,请求频繁,请求时间短。
/** Number of network request dispatcher threads to start. */
private static final int DEFAULT_NETWORK_THREAD_POOL_SIZE = 4;
public RequestQueue(Cache cache, Network network) {
this(cache, network, DEFAULT_NETWORK_THREAD_POOL_SIZE);
}
Network network = new BasicNetwork(stack);
评论0
最新资源