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

相关文章

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

Java 结构化并发Structured Concurrency实践举例

《Java结构化并发StructuredConcurrency实践举例》Java21结构化并发通过作用域和任务句柄统一管理并发生命周期,解决线程泄漏与任务追踪问题,提升代码安全性和可观测性,其核心... 目录一、结构化并发的核心概念与设计目标二、结构化并发的核心组件(一)作用域(Scopes)(二)任务句柄

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2