【源码】"拆" 网络请求库-Volley(中)

简介: Volley跟AsyncTask一样,都是老古董了,最早发布于2013年的Google I/O大会,初衷就是:让Android开发者少写重复的请求代码。

0x2、并发设计


像上面HttpUrlConnection的例子,每发起一次请求,都新起一个线程,太蠢了


  • 没复用线程,频繁创建销毁线程造成不必要的开销;


  • 没对最大线程数做一个限制,可能会造成过度资源竞争,系统使用率不高;


所以涉及到并发的开源项目,线程池 基本是没得走的了,再配个 任务队列 进出队列操作加锁,有时为了解耦,还会再拆出来一个 调度器死循环 访问 任务队列,取出任务交由线程池执行。


Volley是支持并发的,看下它是如何设计的,没有找到线程池初始化代码,倒是找到了 两个线程实现类


网络异常,图片无法展示
|


网络异常,图片无法展示
|


NetworkDispatcher 继承 Thread类,所以这里默认定义了 容量为4的线程数组,另外一个线程 CacheDispatcher。它们都在 RequestQueue → start() 中启动:


网络异常,图片无法展示
|


跟下start()的调用处 Volley → newRequestQueue


网络异常,图片无法展示
|


就是实例化RequestQueue的时候,就创建并开启了这些线程。


0x3、请求调度设计


调用 RequestQueue → add() 请求入队,跟下具体实现:


网络异常,图片无法展示
|


用到三个集合,根据对应注释推演出各种用途:


  • mCurrentRequests : HashSet → 正在处理的所有请求(包括等待和处理中)的集合;
  • mNetworkQueue : PriorityBlockingQueue → 非缓存请求队列;
  • mCacheQueue : PriorityBlockingQueue → 缓存请求队列;


入队比较简单,接着看下具体的调度流程,不难看出分成两类,走缓存(默认)和不走缓存,先看前者~


① 不走缓存的请求


NetworkDispatcher → run()


网络异常,图片无法展示
|


网络异常,图片无法展示
|


死循环拿队列的请求,处理请求后的结果流向有四个:


  • 请求处于取消状态 → request.finish("network-discard-cancelled");
  • 304且响应已解析过 → request.finish("not-modified");
  • 正常结束 → mDelivery.postResponse(request, response);
  • 异常结束 → mDelivery.postError(request, volleyError);


先跟下 Request → finish()


网络异常,图片无法展示
|


网络异常,图片无法展示
|


比较简单:移除集合中的请求,打日志,调用下请求结束的回调,接着看下后两个,跟下 ExecutorDelivery


网络异常,图片无法展示
|


跟下 mResponsePoster 初始化部分代码:


网络异常,图片无法展示
|


好吧,就是一个 执行器,负责将任务分发出去,因为后续操作在主线程操作,所以得用 Handler


接着,看下任务具体做了啥 ResponseDeliveryRunnable → run()


网络异常,图片无法展示
|


网络异常,图片无法展示
|


正常请求的流转还是很好理解的,接着看下走缓存请求的调度过程~


② 走缓存的请求


直接跟 CacheDispatcher → run(),同样是死循环,直接看 processRequest() 部分代码:


网络异常,图片无法展示
|


简单点说:有缓存且缓存没过期直接返会,其他情况把请求加到请求队列中。接着再看看缓存这块是咋设计的~

目录
打赏
0
0
0
0
7
分享
相关文章
使用通义灵码AI高效学习muduo网络库开发指南
Muduo 是一个基于 C++11 的高性能网络库,支持多线程和事件驱动,适用于构建高效的服务器和应用程序。它提供 TCP/IP 协议支持、异步非阻塞 I/O、定时器、异步日志等功能,并具备跨平台特性。通过 Git 克隆 muduo 仓库并切换至 C++17 分支可开始使用。借助 AI 工具如 Deepseak-v3,用户可以更便捷地学习和理解 Muduo 的核心模块及编写测试用例,提升开发效率。
Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
gev 是一个基于 epoll 和 kqueue 实现的高性能事件循环库,适用于 Linux 和 macOS(Windows 暂不支持)。它支持多核多线程、动态扩容的 Ring Buffer 读写缓冲区、异步读写和 SO_REUSEPORT 端口重用。gev 使用少量 goroutine,监听连接并处理读写事件。性能测试显示其在不同配置下表现优异。安装命令:`go get -u github.com/Allenxuxu/gev`。
网络请求库 – axios库
网络请求库 – axios库
280 60
NeurIPS 2024:标签噪声下图神经网络有了首个综合基准库,还开源
NoisyGL是首个针对标签噪声下图神经网络(GLN)的综合基准库,由浙江大学和阿里巴巴集团的研究人员开发。该基准库旨在解决现有GLN研究中因数据集选择、划分及预处理技术差异导致的缺乏统一标准问题,提供了一个公平、用户友好的平台,支持多维分析,有助于深入理解GLN方法在处理标签噪声时的表现。通过17种代表性方法在8个常用数据集上的广泛实验,NoisyGL揭示了多个关键发现,推动了GLN领域的进步。尽管如此,NoisyGL目前主要适用于同质图,对异质图的支持有限。
135 7
🎓Python网络请求新手指南:requests库带你轻松玩转HTTP协议
本文介绍Python网络编程中不可或缺的HTTP协议基础,并以requests库为例,详细讲解如何执行GET与POST请求、处理响应及自定义请求头等操作。通过简洁易懂的代码示例,帮助初学者快速掌握网络爬虫与API开发所需的关键技能。无论是安装配置还是会话管理,requests库均提供了强大而直观的接口,助力读者轻松应对各类网络编程任务。
231 3
HTTP协议大揭秘!Python requests库实战,让网络请求变得简单高效
【9月更文挑战第13天】在数字化时代,互联网成为信息传输的核心平台,HTTP协议作为基石,定义了客户端与服务器间的数据传输规则。直接处理HTTP请求复杂繁琐,但Python的`requests`库提供了一个简洁强大的接口,简化了这一过程。HTTP协议采用请求与响应模式,无状态且结构化设计,使其能灵活处理各种数据交换。
145 8
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
在数据驱动的时代,网络数据抓取对于数据分析、机器学习等至关重要。HTTP协议作为互联网通信的基石,其重要性不言而喻。Python的`requests`库凭借简洁的API和强大的功能,成为网络数据抓取的利器。本文将通过实战演练展示如何使用`requests`库进行数据抓取,包括发送GET/POST请求、处理JSON响应及添加自定义请求头等。首先,请确保已安装`requests`库,可通过`pip install requests`进行安装。接下来,我们将逐一介绍如何利用`requests`库探索网络世界,助你成为数据抓取大师。在实践过程中,务必遵守相关法律法规和网站使用条款,做到技术与道德并重。
148 2
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
155 3
超级好用的C++实用库之网络
超级好用的C++实用库之网络
120 0