Android Volley 网络并发 监听网络队列完成
2016-04-12 14:23
489 查看
先说明一下原理:
1.利用反射机制获取 RequestQueue 队列中 mCurrentRequests 当前请求的集合,如果size==0, 则说明并发性网络请求已完成,为了保证准确性,建议给需要监听的网络请求设置tag,并利用tag进行过滤
2.利用定时循环线程进行动态取值
代码如下:
说明:
1, 第一个方法中tag==null, 本人在代码用默认使用当前页面的类名进行过滤(如果不使用,可以忽略)
2. 使用handler 是为了保证在主线程用调用回调接口可以进行UI操作
3. mTimeoutMs 是为了避免死锁问题
1.利用反射机制获取 RequestQueue 队列中 mCurrentRequests 当前请求的集合,如果size==0, 则说明并发性网络请求已完成,为了保证准确性,建议给需要监听的网络请求设置tag,并利用tag进行过滤
2.利用定时循环线程进行动态取值
代码如下:
public static void whetherRequestCompleted(Context context,RequestSchedule requestSchedule){ whetherRequestCompleted(context,null,requestSchedule); } public static void whetherRequestCompleted(final Context context, final Object requestTag, final RequestSchedule requestSchedule){ final Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { if(msg.what==0){ requestSchedule.completed(); }else if(msg.what==1){ requestSchedule.failed((Exception)msg.obj); } } }; final Timer timer = new Timer(); timer.schedule(new TimerTask() { int num = 0; public void run() { try { ++this.num; boolean e = true; RequestQueue requestQueue = VolleyManager.getRequestQueue(context); Field field = requestQueue.getClass().getDeclaredField("mCurrentRequests"); field.setAccessible(true); Set set = (Set)field.get(requestQueue); if(set!=null&&set.size()>0){ Iterator var5 = set.iterator(); while(var5.hasNext()) { Request r = (Request)var5.next(); if(r!=null&&r.getTag()!=null){ if(r.getTag().equals(requestTag == null?context.getClass().getName():requestTag)) { e = false; } } } } if(e) { Message message=new Message(); message.what=0; message.obj=null; handler.sendMessage(message); timer.cancel(); return; } if((long)(this.num * 1000) > VolleyManager.mTimeoutMs) { Message message=new Message(); message.what=1; message.obj=new TimeoutException(); handler.sendMessage(message); timer.cancel(); return; } } catch (NoSuchFieldException var7) { Message message=new Message(); message.what=1; message.obj=var7; handler.sendMessage(message); timer.cancel(); } catch (IllegalAccessException var8) { Message message=new Message(); message.what=1; message.obj=var8; handler.sendMessage(message); timer.cancel(); } catch (ConcurrentModificationException var9) { } } }, 0L, 1000L); } public interface RequestSchedule{ abstract void completed(); abstract void failed(Exception e); }
说明:
1, 第一个方法中tag==null, 本人在代码用默认使用当前页面的类名进行过滤(如果不使用,可以忽略)
2. 使用handler 是为了保证在主线程用调用回调接口可以进行UI操作
3. mTimeoutMs 是为了避免死锁问题
相关文章推荐
- 当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
- Android: WebView加载网页的几种方式及网络异常处理
- http 请求头
- 使用域账号统一管理cisco网络设备
- DL:卷积神经网络(CNN)的一些学习网址
- angularJS里的$http.post传数据到php接收问题
- golang http服务器跨域问题解决
- 神经网络第一部分:背景Neural Networks, Part 1: Background
- 神经网络第二部分:神经元Neural Networks, Part 2: The Neuron
- 神经网络第三部分:网络Neural Networks, Part 3: The Network
- 神经网络第三部分:网络Neural Networks, Part 3: The Network
- 【ZOJ3933 The 16th Zhejiang University Programming ContestG】【费用流】Team Formation 最多组队条件下女
- PHP CURL HTTP研究
- 从贝叶斯方法谈到贝叶斯网络
- java.lang.ClassCastException: libcore.net.http.HttpURLConnectionImpl cannot be cast to javax.net.ssl
- 深度神经网络入门教程Deep Neural Networks: A Getting Started Tutorial
- 神经网络指南Hacker's guide to Neural Networks
- 学Http协议
- 用matlab训练数字分类的深度神经网络Training a Deep Neural Network for Digit Classification
- 卷积神经网络Convolutional Neural Networks