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

2024-06-18 11:39

本文主要是介绍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 是为了避免死锁问题

这篇关于Android Volley 网络并发 监听网络队列完成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071963

相关文章

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四