Android之TypedArray 为什么需要调用recycle()

转自:http://blog.csdn.net/Monicabg/article/details/45014327

在 Android 自定义 View 的时候,需要使用 TypedArray 来获取 XML layout 中的属性值,使用完之后,需要调用 recyle() 方法将 TypedArray 回收。

那么问题来了,这个TypedArray是个什么东西?为什么需要回收呢?TypedArray并没有占用IO,线程,它仅仅是一个变量而已,为什么需要 recycle? 
为了解开这个谜,首先去找官网的 Documentation,到找 TypedArray 方法,得到下面一个简短的回答:


简单翻译下来,就是说:回收 TypedArray,用于后续调用时可复用之。当调用该方法后,不能再操作该变量。

同样是一个简洁的答复,但没有解开我们心中的疑惑,这个TypedArray背后,到底隐藏着怎样的秘密……

求之不得,辗转反侧,于是我们决定深入源码,一探其究竟……

首先,是 TypedArray 的常规使用方法:

TypedArray array = context.getTheme().obtainStyledAttributes(attrs,R.styleable.PieChart,0,0);
try {mShowText = array.getBoolean(R.styleable.PieChart_showText,false);mTextPos = array.getInteger(R.styleable.PieChart_labelPosition,0);
}finally {array.recycle();
}
可见,TypedArray不是我们new出来的,而是调用了 obtainStyledAttributes 方法得到的对象,该方法实现如下:

public TypedArray obtainStyledAttributes(AttributeSet set,int[] attrs, int defStyleAttr, int defStyleRes) {final int len = attrs.length;final TypedArray array = TypedArray.obtain(Resources.this, len);// other code .....return array;
}
我们只关注当前待解决的问题,其他的代码忽略不看。从上面的代码片段得知,TypedArray也不是它实例化的,而是调用了TypedArray的一个静态方法,得到一个实例,再做一些处理,最后返回这个实例。看到这里,我们似乎知道了什么,,,带着猜测,我们进一步查看该静态方法的内部实现:

/*** Container for an array of values that were retrieved with* {@link Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)}* or {@link Resources#obtainAttributes}.  Be* sure to call {@link #recycle} when done with them.** The indices used to retrieve values from this structure correspond to* the positions of the attributes given to obtainStyledAttributes.*/
public class TypedArray {static TypedArray obtain(Resources res, int len) {final TypedArray attrs = res.mTypedArrayPool.acquire();if (attrs != null) {attrs.mLength = len;attrs.mRecycled = false;final int fullLen = len * AssetManager.STYLE_NUM_ENTRIES;if (attrs.mData.length >= fullLen) {return attrs;}attrs.mData = new int[fullLen];attrs.mIndices = new int[1 + len];return attrs;}return new TypedArray(res,new int[len*AssetManager.STYLE_NUM_ENTRIES],new int[1+len], len);}// Other members ......
}

仔细看一下这个方法的实现,我想大部分人都明了了,该类没有公共的构造函数,只提供静态方法获取实例,显然是一个典型的单例模式。在代码片段的第 13 行,很清晰的表达了这个 array 是从一个 array pool的池中获取的。

因此,我们得出结论:

程序在运行时维护了一个 TypedArray的池,程序调用时,会向该池中请求一个实例,用完之后,调用 recycle() 方法来释放该实例,从而使其可被其他模块复用。

那为什么要使用这种模式呢?答案也很简单,TypedArray的使用场景之一,就是上述的自定义View,会随着 Activity的每一次Create而Create,因此,需要系统频繁的创建array,对内存和性能是一个不小的开销,如果不使用池模式,每次都让GC来回收,很可能就会造成OutOfMemory。

这就是使用池+单例模式的原因,这也就是为什么官方文档一再的强调:使用完之后一定 recycle,recycle,recycle。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么就像谈恋爱一样?

1 向这只猫学习!我的妈耶,这撩人的眼神,这小手,以后这大兄die的女朋友还要跟一只猫吃醋,默默先心疼一下2 善良的人最可爱了!3 妈妈救我,马路牙子不让我去找你4 这是童年的回忆呀5 一位网友收到老…

.NET Regular Expressions

HTML去空白回车换行 private static readonly Regex REGEX_LINE_BREAKS new Regex("\n\s*", RegexOptions.Compiled); private static readonly Regex REGEX_LINE_SPACE new Regex("\n\s*\r", RegexOptions.Compiled); private static readonly Regex R…

他拥有当今世界最高智商,从出生就一路开挂,然而,获得数学最高奖的他却说自己只是个热爱数学的普通人...

全世界只有3.14 % 的人关注了爆炸吧知识今天就讲讲这位平易近人的顶级天才吧。1975年,陶哲轩出生在澳大利亚,父母均毕业于香港大学,父亲陶象国是一名儿科医生,母亲梁蕙兰是物理和数学专业的高材生,曾当过中学数学教师。…

Win11用户增长迅速!你升了吗?

近日,AdDuplex 发布了 2021 年 11 月微软现代 Windows 操作系统的市场报告。现代 Windows 操作系统的统计只包括 Windows 11 和 Windows 10。Windows 11在 11 月,Windows 11 操作系统的市场份额达到 8.9%,其中包括 8.6% 运行 Windows 11 正式…

豆瓣9分,颠覆世界观的好书,每读一章就感叹一次:原来如此!(免费领)

全世界只有3.14 % 的人关注了爆炸吧知识聪明人的投资直击本质股神巴菲特曾在2019股东大会上,遇到了一位来自美国旧金山的年轻人提问:“要想成为一个好的投资者,最好的方法是什么?”巴菲特毫不犹豫回答道:“阅读”。5岁…

C# WPF MVVM开发框架Caliburn.Micro Screens, Conductors 和 Composition⑦

01—Screens, Conductors and CompositionActions, Coroutines and Conventions往往最能吸引Caliburn.Micro的注意力,但如果你想让你的UI设计得更好,那么了解屏幕和导体可能是最重要的。如果您想利用合成,这一点尤其重要。杰里米米勒最近在为…

如此生猛的纪录片,背后是难以置信的故事!

全世界只有3.14 % 的人关注了爆炸吧知识美国纪录片大师阿尔伯特梅索斯所言:“制作一部电影不是为一个问题寻求答案,而是尝试去捕捉生活本身。”从赵忠祥那句大名鼎鼎的“春天到了,又到了动物交配的季节”开始,纪录片看似没有像影视…

官宣!.NET官网发布中⽂版

#官宣.NET简体中文版.NET的官网终于正式发布简体中⽂版本了,⽽且是作为官方支持的第一梯队!这是一个影响未来中国.NET技术生态的大事。我承认好的英文是从事IT技术的重要基础,但本地化语言能帮助更多人了解、学习、应用该技术。.NET官网中文版…

爱因斯坦为什么不是普通人?看他怎么喝茶就明白了,差距太明显了!没法比.......

全世界只有3.14 % 的人关注了爆炸吧知识来源:Закройте, дует看到上面这个动图,猜到这篇文章要讲什么了吗?讲泡茶,啊呸!讲“茶叶悖论”,一个爱因斯坦喝茶时不经意间看到的物理现象,然…

在应用程序中实现对NandFlash的操作

以TC58NVG2S3ETA00 为例: 下面是它的一些物理参数: 图一 图二 图三 图四 图五 图6-0 图6-1 说明一下,在图6-1中中间的那个布局表可以看做是实际的NandFlash一页数据的布局,其中Data区域用于存放有效的数据,也就是我们可…

1 盒用 1 年,这个防雾黑科技,让你的眼镜再也不起雾!

▲ 点击查看本来被疫情这么一闹,口罩就已经成了我们离不开的刚需品。现在天气大幅度降温,口罩更不能摘了,必须得御寒防疫两手抓!虽然口罩的优点有目共睹,但它最大的 Bug 也够大伙儿吐槽一顿了——口罩眼镜一秒起雾&…

福利好礼现金大奖等你来→首届 .NET Conf China Hackathon 火热报名中!

.NET 开源以来越来越多的开发者和企业开始加入到 .NET 的生态。.NET 6 是 .NET Framework, .NET Core 和 Mono 三个平台完成融合的第一个长期支持版本,无论你是开发云原生应用,还是 IOT 应用,移动端,桌面应用,.NET 6 …

java属于面相_[Java教程]面相对象

[Java教程]面相对象0 2018-09-13 16:00:26面向对象那什么是面向对象? 在Java 中,我们是一切皆对象,所有的方法都是围绕着对象来的。面相对象是相对面向过程而来的,他们都是一种思想,面向过程,强调的是一种功…

下面由我来给大家表演个绝活

1 娶个老婆真不容易啊!▼2 孩子有些东西不是努力就能吃到的啊▼3 给大家表演个绝活▼4 在危险的边缘一点点试探▼5 你知道为什么狗子要拆家了吗▼6 外国版姜太公钓鱼愿者上钩▼7 最好看的那个晚霞永远出现在教室的窗外▼你点的每个赞,我都认真当成…

.Net 下高性能分表分库组件-连ShardingCore接模式原理

ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案,具有零依赖、零学习成本、零业务代码入侵。Github Source Code 助力dotnet 生态 Gitee Source Code介绍在分表分库领域java有着很多的解决方案,尤其是客户端解决方案(ShardingSphere)&…

php 利用http上传协议(表单提交上传图片 )

主要就是利用php 的 fsocketopen 消息传输。 这里先通过upload.html 文件提交,利用chrome抓包,可以看到几个关键的信息。 首先指定了表单类型为multipart/form-data;。 boundary是分隔符 因为上传文件不在使用原有的http协议了。请求内容不再可能以 x…

重新认识Docker Compose之Sidecar模式

什么是Docker Compose在微服务盛行的今天,我们通常是这么定义Compose的:对容器的统一启动和关闭的编排工具。但是我以前还是有个疑惑,谁会用Compose在一台服务器上部署多个服务呢?干脆直接用单体服务就行了!直到我遇到…

数学家看到就把持不住,高斯被它迷得神魂颠倒,2600年的数学史里的一个奇迹……...

全世界只有3.14 % 的人关注了爆炸吧知识数学的美两个字就能说清数学女神很可能是个洁癖她的苛刻就体现在公式里那每一个符号每一个数字都不允许有哪怕一点杂质如此才是她最认可的孩子因为知道了勾股定理古人们才创造了辉煌因为有了经典力学公式人类才能探索星辰大海因为掌握了质…

编程语言也环保?C语言领跑,Python、Perl垫底

文 | Travis出品 | OSC开源社区(ID:oschina2013)毋庸置疑,Python 是世界上最流行的编程语言之一,其被广泛运用于人工智能、数据分析、网络爬虫和 Web 开发等领域。在上个月的 TIOBE 榜单中,Python 一举超过…

我靠“读书笔记”闷声赚3万:那些你看不上的行业,往往最赚钱

全世界只有3.14 % 的人关注了爆炸吧知识你有没有计算过:你的时间,值多少钱?如果你月薪5000,一个月工作20天,每天8小时,那么你1小时的价值就是32元。然而,现在请一个打扫卫生的钟点工&#xff0c…