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

相关文章

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

python安装完成后可以进行的后续步骤和注意事项小结

《python安装完成后可以进行的后续步骤和注意事项小结》本文详细介绍了安装Python3后的后续步骤,包括验证安装、配置环境、安装包、创建和运行脚本,以及使用虚拟环境,还强调了注意事项,如系统更新、... 目录验证安装配置环境(可选)安装python包创建和运行Python脚本虚拟环境(可选)注意事项安装

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot整合Canal+RabbitMQ监听数据变更详解

《SpringBoot整合Canal+RabbitMQ监听数据变更详解》在现代分布式系统中,实时获取数据库的变更信息是一个常见的需求,本文将介绍SpringBoot如何通过整合Canal和Rabbit... 目录需求步骤环境搭建整合SpringBoot与Canal实现客户端Canal整合RabbitMQSp

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor