Volley使用很长时间了,在网上一查一大把的教程,这里说的这点基本是没有人提过的,那就是Volley 创建RequestQueue的模式。
Volley.newRequestQueue是创建一个请求队列,首先这个是比较耗资源的,而且不会自动回收的,当大量创建的时候肯定会抛出异常,做过实验,一个请求创建一个队列,大概100个左右程序就崩了
重点来了,你肯定会说谁不知道用单例啊?网上几乎所有人都说用单例,我也很长世间都用单例,直到有一天我们产品经理拿着IOS和安卓对比后过来找我说安卓这个界面加载速度比IOS平均慢两秒,what fuck?难道不是服务器的问题吗?
当然不是,很明确告诉你就是单例惹得祸,因为这个界面两个接口同时访问,一个接口比较慢,一个接口比较快,但是我这边总是慢的接口先回调数据然后才是快的接口再回调,具体是因为一个队列的请求本来就是串行的还是说请求是并行的但回调是串行的就不去深究了,反正确定不是完全并行的
OK,找到原因就得修改代码了,这里就直接贴代码吧,使用的一个队列容器来储存3个RequestQueue队列,这里我设置最多3个队列
具体意思就是一个容器装3个队列,每次取队列的第一个使用,然后放到队尾去,保证同时3个请求使用不同的队列达到最高请求效率
public class Queue { private static int MAXQUEUE = 3;//最多3个队列 private static LinkedBlockingQueue<RequestQueue> queue = new LinkedBlockingQueue(MAXQUEUE); public static RequestQueue getQueue() { RequestQueue rq = null; try { if (queue.size() < MAXQUEUE) {//如果还没有3个队列新建队列 queue.offer(Volley.newRequestQueue(MyApplication.getContext()));//放入容器 } rq = queue.poll();//从容器取出 queue.offer(rq);//把队列放到尾部 } catch (Exception e) { e.printStackTrace(); return Volley.newRequestQueue(MyApplication.getContext()); } return rq != null ? rq : Volley.newRequestQueue(MyApplication.getContext()); } }另外本人喜欢看视频看直播,自己就写了一个简单的小工具,可以看爱奇艺和腾讯的VIP视频,然后聚合市场所有的直播平台,真心不想在手机上装太多软件
有兴趣的可以扫码下载研究一下