Volley框架关于RequestQueue的心得

本文探讨了在Volley框架中正确使用RequestQueue的重要性,解释了线程池的作用,提供了创建单例和放入Application的方法,并通过案例演示了不同实现方式。建议采用单例模式来管理RequestQueue,以提高应用程序的性能和资源利用率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天领导突然说我的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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值