Android 布局异步加载中的pools对象缓存池源码分析

Android 自带对象池Pools工具类简介 Android 包 androidx.core.util 下有个工具类 Pools,为开发者提供了两种对象池,没有同步控制的SimplePool 和 有同步控制(访问加锁)的SynchronizedPool(继承自SimplePool),方便开发者根据需要创建对应类型的对象池 Pools类的源码也非常简单,一看就懂 public final class Pools { /** * 对象池接口 */ public interface Pool<T> { 阅读详情

obj.inflater = null;

obj.parent = null;

obj.resid = 0;

obj.view = null;

mRequestPool.release(obj);

}

使用方法,如下:

public class MyPooledClass {

private static final SynchronizedPool sPool =

new SynchronizedPool(10);

public static MyPooledClass obtain() {

MyPooledClass instance = sPool.acquire();

return (instance != null) ? instance : new MyPooledClass();

}

public void recycle() {

// Clear state if needed.

sPool.release(this);

}

}

[](()Pool接口的定义

来让我们看看这个Pool的接口,接口很简单,就2个方法。 acquire()主要是从缓存池中获取一个对象,这里可能为空。为空的情况:

[](()1,对象缓存池中没有缓存对象,这种情况是对象池中没有放进任何对象。
[](()2,对象池中对象被用完了。

release() 主要是释放一个对象到对象缓存池中,如果 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 这个对象已经存在缓存池中,会抛出异常,如果缓存对象池已满,则返回false,不做任何操作。

public interface Pool {

/**从缓存池中返回一个对象,可能为空。

  • @return An instance from the pool if such, null otherwise.

*/

@Nullable

T acquire();

/**

  • Release an instance to the pool.

*释放一个对象到对象缓存池中

  • @param instance The instance to release.

  • 对象实例是否放入对象缓存池中

  • @return Whether the instance was put in the pool.

*如果这个对象已经存在缓存池中,会抛出异常

  • @throws IllegalStateException If the instance is already in the pool.

*/

boolean release(@NonNull T instance);

}

[](()SimplePool的源码

具体的实现逻辑在SimplePool,但这里没有加锁,如需要加锁,使用SynchronizedPool即可。 缓存大小mPoolSize必须大于0,否则抛出异常。 调用acquire()时候,先判断mPoolSize是否大于0: 如果小于0,返回null。 如果大于0,证明对象池中还有可用对象,然后取一个使用,这个对象从数组中移出(后面release会把它再加回来,觉得这里设计好巧妙)。mPoolSize减一。返回缓存实例。

调用release(),会先调用isInPool()判断这个对象是否存在数组中,存在就抛出异常。因为acquire()时候已经把它移出了。主要防止一个对象重复保存到数组中,操作同一对象发生未知异常。 然后判断pool是否已满,如果没有存满,缓存一个对象,mPoolSize加一。如果存满,直接返回false。下面是SimplePool的源码。

public static class SimplePool implements Pool {

//线程池对象数组

private final Object[] mPool;

//线程池目前可用对象size,意思是还存在多少个对象在数组中。

private int mPoolSize;

/**

  • Creates a new instance.

  • 最大对象池size

  • @param maxPoolSize The max pool size.

  • @throws IllegalArgumentException If the max pool size is less than zero.

*/

public SimplePool(int maxPoolSize) {

if (maxPoolSize <= 0) {

throw new IllegalArgumentException(“The max pool size must be > 0”);

}

mPool = new Object[maxPoolSize];

}

public T acquire() {

//判断 mPoolSize ,判断对象池是否已经用完了。用完了返回null

if (mPoolSize > 0) {

//取一个下标

final int lastPooledIndex = mPoolSize - 1;

//取出一个对象

T instance = (T) mPool[lastPooledIndex];

//把这个对象从数组中移出(后面release会把它再加回来)觉得这里设计好巧妙。

mPool[lastPooledIndex] = null;

//下标减1,意思是已经拿走一个去使用了。

mPoolSize–;

//返回对象

return instance;

}

//对象池用完了,返回null,让上层自己去新建一个吧

return null;

}

@Override

public boolean release(@NonNull T instance) {

Java:对象池Pools 当我们创建了一些对象,又希望在某些时候重复使用,这样可以避免对象的频繁创建和引起垃圾回收,提高使用效率。这时,对象池就可以帮我们处理这个事情了。比如创建了几个数组,那我可以先把他们保存起来,需要使用时,从池子里取出来,存放新的数据或者复用数据都是可的。对象池的代码也相对简单,具体来看一下:Pools是一个final类。它里面有一个接口。Pools.java文件中包含两个静态类。 阅读详情

相关推荐

Android 异步加载解决方案

NULL 博文链接:https://jgeng.iteye.com/blog/1630650

Pool, SimplePool与SynchronizedPool

SynchronizedPool,线程池,Android,ThreadPool VelocityTracker 因为硬件资源的限制,Android在很多地方都使用了Pool的,特别是对于需要通过native的方式调用资源,比如专门用于获取Touch、Flinging以及其他手势速度的VelocityTracker类,文档中指明了调用方式必须是: 1 2 3 4 5 6 // 创建 VelocityTracker mVeloc

蜗牛快跑 2117

Netapp FAS2750热备盘替换失败问题分析与解决

本文深入分析了Netapp FAS2750存储系统中热备盘替换失败的故障现象,揭示了磁盘分区属主不匹配导致数据同步无法启动的根本原因。通过详细的排查步骤和解决方案,帮助运维人员快速恢复aggr状态,并提供了长期预防措施和最佳实践建议,确保存储系统的高可用性。

weixin_33737774的博客 399

内存优化(三)Android对象池使用

文章目录概述Android Object PoolsPools源码解析:Pools结合Builder模式使用案例:使用总结和注意事项 概述 由内存优化(一)浅谈内存优化中看出,内存优化不仅要从防止内存泄露入手,也要注意频繁GC卡顿,内存抖动以及不必要的内存开销造成的内存需求过大或者内存泄露。而避免内存无用开销就必须理解Android开发中的一个重要原则——对象复用。 对象复用在我们开发中使用的案例...

sslinp的博客 1575

Windows server Database 2025 安装 i225/i226 网卡驱动

Windows server Database 2025 安装 i225/i226 网卡驱动 windows这比坏得很,intel消费级网卡不准在服务器系统上安装。你要说他是异构不支持?他就纯粹恶心人。 之前已经安装过一次,但是今天database预览版一更新,又给我把网卡驱动杀了,气死,写一篇教程。 到这里就完成了,总之还是想辱骂windows,提供便捷的同时又人为制造困难,多少有点(隔壁linux内核直接自带全家桶了就一省心) 并且近年Intel的新U安装显卡驱动和普通声卡驱动都不会出声

低温热源的博客 1万+

【数学建模】编程手学习路线

在学习过程中,建议注重理论与实践相结合,多进行实例练习和项目实践,以巩固所学知识并提升实际应用能力。同时,保持对新技术和新方法的关注和学习,不断提升自己的专业素养和竞争力。NumPy、Pandas、Matplotlib和Seaborn等库是数据处理和可视化的重要工具。掌握常用机器学习算法的原理和应用,如决策树、支持向量机、神经网络等。学习内容包括微积分、线性方程组、矩阵运算、概率分布、统计推断等。学习内容包括基本语法、函数和模块、面向对象编程、文件操作等。深入了解优化理论和方法,如梯度下降法、牛顿法等。

2301_79586491的博客 2962

Android 性能优化系列 - 03 使用对象池优化内存

避免在循环里面或者频繁被调用的方法里面创建对象,在循环或者被频繁调用的方法之外创建对象使用对象池缓存对象,在使用对象的时候,直接从对象池中取对象即可,避免频繁的创建对象一般来讲,实现对象池有三种方法,对应的具体的数据结构即是数组、链表和 Map,下面我将通过示例分别介绍通过这三种数据结构实现的对象池首先是Pool<T>接口定义,代码不难,如下所示,只有两个方法acquire()和方法acquire():从对象池中取一个对象,注意:有可能会返回 null:将一个对象释放到对象池中,

Dream It Possible 1070

爬取二手房数据:Python爬虫+Geopy实战,看透房价与地理位置的隐藏关系

哪些区域单价虚高(房源少但单价远高于周边);哪些小区性价比高(靠近地铁/学校,单价低于同地段平均水平);房价与地理位置的量化关系(如距离地铁每远1公里,单价下降多少)。如果想扩展分析范围,可爬取多个城市/区域的数据,对比不同城市的房价差异;或结合时间维度(定期爬取),分析房价的涨跌趋势。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 948

Android 布局异步加载中的pools对象缓存池源码分析(1),安卓面试题app

使用方法,如下: public class MyPooledClass { private static final SynchronizedPool sPool = new SynchronizedPool(10); public static MyPooledClass obtain() { MyPooledClass instance = sPool.acquire(); return (instance != null) ? instance : new MyPooledClass(); } pub

m0_66264881的博客 178

2026年7月19日 从可插拔到共封装:技术路线研究报告

AI 算力的爆发正在重写数据中心光互连的技术路线。本报告对当前并存的四代光互连架构——

weixin_51184047的博客 586

【软件系统架构】系列六: SysML(系统建模语言)

SysML(系统建模语言)是OMG组织基于UML扩展的专用建模语言,用于支持复杂系统全生命周期建模。它包含9类标准图,核心建模元素包括块(Block)、端口接口、需求和约束等。与UML相比,SysML更适用于软硬件结合的复杂系统建模。作为MBSE的核心工具,SysML通过结构图、行为图、需求图和参数图实现系统设计、需求追踪和性能验证。虽然面临学习门槛高、工具成本高等挑战,但随着AI融合和国产化替代趋势,SysML在航空航天、汽车电子等领域的应用日益广泛。SysML v2将简化语法并提升互操作性,推动系统工程

moton2017的博客 2385

android 缓存池,Android 布局异步加载中的pools对象缓存池源码分析

前言对象缓存池很多地方都用到,比比皆是。主要是供后续的应用程序重复使用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。比如在:AsyncLayoutInflater的使用:布局异步(AsyncLayoutInflater)加载中,对于AsyncLayoutInflater.InflateRequest的对象缓存。public AsyncLayoutInflater.InflateReq...

weixin_42366954的博客 236

YOLOv8改进 | 融合篇,YOLOv8改进主干网络为MobileNetV3+CA注意机制+添加小目标检测层(全网独家首发,实现极限涨点)

小目标检测难点众多,导致很多算法对小目标的检测效果远不如大中型目标。影响算法性能的主要原因如下:第一,小目标分辨率低、信息量不足,导致神经网络提取到的有效特征较少。第二,小目标在图像中所占的区域较小,易受背景干扰,这对算法的定位性能要求较高。第三,小物体标注困难,训练数据有限,导致模型泛化能力差。例如多尺度学习、无锚机制和生成对抗学习等方法,都能提高小目标检测的准确性和鲁棒性。为了改善小目标漏检现象严重的问题,我在 YOLOv8 中增加了 P2 检测头,相当于有四个检测头,使网络能检测到更小的目标。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2857

Android 布局异步加载中的pools对象缓存池源码分析,34岁程序员年薪50w

} 使用方法,如下: public class MyPooledClass { private static final SynchronizedPool sPool = new SynchronizedPool(10); public static MyPooledClass obtain() { MyPooledClass instance = sPool.acquire(); return (instance != null) ? instance : new MyPooledClass(); } p

m0_65145426的博客 302

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

2024年Android最新Android 布局异步加载中的pools对象缓存池源码分析,Android面试你必须要知道的那些知识

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的。

2401_84563405的博客 623

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android 布局异步加载中的pools对象缓存池源码分析,音视频时代你还不会NDK开发

来源官方class上面的的使用介绍,recycle(),这里可以对实例对象进行清洁,意思是初始化里面的字段,也可以不清洁,看需求吧。AsyncLayoutInflater实例对象缓存中的就做了初始化,再缓存实例对象,代码如下: public void releaseRequest(InflateRequest obj) { //重置一下实例对象 obj.callback = null; obj.inflater = null; obj.parent = null; obj.resid = 0; obj.vi

m0_64604842的博客 399

Android 布局异步加载中的pools对象缓存池源码分析,移动互联网app开发入门

} 使用方法 来源官方class上面的的使用介绍,recycle(),这里可以对实例对象进行清洁,意思是初始化里面的字段,也可以不清洁,看需求吧。AsyncLayoutInflater实例对象缓存中的就做了初始化,再缓存实例对象,代码如下: public void releaseRequest(InflateRequest obj) { //重置一下实例对象 obj.callback = null; obj.inflater = null; obj.parent = null; obj.resid = 0;

m0_66145114的博客 173

Android V4包中的 Pool ,SimplePool ,SynchronizedPool 解析

由于Android手机硬件资源的限制,Android在很多地方都使用到了Pool,特别是对于需要通过native的方式调用资源,比如专门用于获取Touch、Flinging以及其他手势速度的VelocityTracker类,文档中指明了调用方式必须是: // 创建 VelocityTracker mVelocityTracker = VelocityTracker.obtain(); // 回...

go_going的专栏 1294
上一篇: Android 属性动画(Property Animation) 完全解析
下一篇: Android 百度地图SDK 自动定位、标记定位
Android_1314
博客等级 码龄5年 1粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值