今天领导突然说我的Volley框架写的不好,RequestQueue应该写到Application中,而不应该写到VolleyUtils中,如果写到VolleyUtils中,这样就会导致每次访问网络就新建一个RequestQueue。如果一次性访问多了程序就会报异常。
先说说线程池,我没有经过系统学习,算是野路子出身,所以对于一些概念性的东西不太懂,对于源码也不了解。先说说线程池,通常网络请求有两种形式,一种是请求不是很频繁,但是每次连接之后会保持相当一段时间来读取数据或者写入数据,最后断开,比如文件下载。另一种就是请求频繁,但是连接上以后读写少量数据就断开。考虑到服务器并发问题,如果每个请求来到以后服务器都为他启动一个线程,那么这对服务器的资源可能会造成很大的浪费。通常,我们会用线程池来解决这个问题,首先,在服务器启动的时候,我们可以启动好几个线程,并用一个容器(线程池)来管理这些线程。当请求到来时,可以从池中取一个线程出来,执行任务(通常是对请求的响应),当任务结束后,再将这个线程放入池中备用。如果请求到来而池中没有空闲的线程,该请求需要排队等候,最后当服务器关闭时销毁该池就行。
一个简单的线程池应该包括:1.线程池管理器(ThreadPool),用于启动、停用、管理线程池;2.工作线程(WordThread),线程池中的线程;3.请求接口(WorkRequest),创建请求对象,以供工作线程调度任务执行;4.请求队列(RequestQueue),用于存放和提取请求;5.结果队列(ResultQueue),用于存储请求执行后返回的结果。
如果做一个简单的请求并且不需要线程池保留,通常就可以用Volley.newRequestQueue()在需要的时候创建RequestQueue。但是通常我们封装成一个工具类给所以的界面调用,这种方法就不适用了,我们需要创建一个RequestQueue并设置成一个单例。这样它能够持续保持在整个app的生命周期中。有两种方法,一种是实现一个单例类,里面封装了RequestQueue对象与其他Volley方法,另外一个方法是继承Application,并在onCreate()方法里面建立RequestQueue,但这种方法不推荐,因为一个static单例能够以一种更加模块化的方式提供同样的功能。
下面分享案例:
注:案例中的用的是三种方法实现的,第一种就是普通的用的时候建队列,第二种就是单例模式,第三种是放到Application中,所以运行案例的童鞋要注意一下。
放到application中的代码:
1)先将Manifest.xml中添加MyApplication
2)MyApplication中的实现
public class MyApplication extends Application{
private static RequestQueue queues;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
queues=Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueue(){
return queues;
}
}
3)volley框架中的调用:
RequestQueue requestQueue=MyApplication.getHttpQueue();
requestQueue.add(request);
单例模式的代码(推荐使用)
1)创建单例类
class MySingleton{
private static MySingleton mInstance;
private RequestQueue mRequestQueue;
private static Context mCtx;
private MySingleton(Context context){
mCtx=context;
mRequestQueue=getRequestQueue();
}
public static synchronized MySingleton getInstance(Context context){
if(mInstance == null){
mInstance=new MySingleton(context);
}
return mInstance;
}
public RequestQueue getRequestQueue(){
if(mRequestQueue==null){
mRequestQueue=Volley.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
}
案例下载:
http://download.youkuaiyun.com/detail/u010074054/9165977
参考案例:
Volley建立请求队列:http://blog.youkuaiyun.com/chuyouyinghe/article/details/47443251
JAVA线程池例子:http://blog.youkuaiyun.com/v1v1wang/article/details/5607279
线程池的研究及实现:http://www.cnblogs.com/coser/archive/2012/03/10/2389264.html