疑惑:自定义控件中 TypedArray对象进行为什么要进行recycle()
2016-06-01 21:45
501 查看
今天在学习自定义控件的时候,发现在获取自定义的属性使用之后,对TypedArray属性对象进行了回收操作。我
们知道在一般Bitmap使用完后要进行回收处理,防止内存泄露。这个TypedArray对象只是存储属性值的变量,那为什
么要回收他呢?
猜测: 1.难道是防止内存泄露?这个对象只是在自定义View中使用,没有在其他的组件中引用!!2.对自己定义的属性进行回收利用,这个属性对象只需要创建一次,由系统来维护。不用每次使用自定义View的时候都创建?
验证:
这是官方的API的概述,要调用recycle(),在使用了obtainStyledAttributes(...)两个重载方法后。(高度概括)
这是TypedArray类中获取方法,Typed的对象用一个静态方法来获取的,可以看出是从TypedArrayPool中池中获取的。
<pre name="code" class="java"> static TypedArray obtain(Resources res, int len) {
<span style="color:#ff0000;">final TypedArray attrs = res.mTypedArrayPool.acquire(); </span>
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;
}
结论:正如猜测的一样,使用recycle过后,是将我们之前创建的attrs属性进行回收等待下一次复用,这样,每次引用到我们自定义View的组件重新创建的时候,我们的自定义属性就不会重新的重建,GC就不用频繁的操作这个对象,防止了OOM的出现。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories