Android Volley 网络并发 监听网络队列完成

先说明一下原理:


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 是为了避免死锁问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值