Android的Drawable缓存机制源码分析
2016-02-28 02:59
417 查看
Android获取Drawable的方式一般是Resources.getDrawable(int),Framework会返回给你一个顶层抽象的Drawable对象。而在Framework中,系统使用了享元的方式来节省内存。为了证明这一点,我们来写一个小demo:
我们在我们的Android项目中引入一个简单的图片test.png。由于我们只是为了享元的结论,我们定义一个简单的Activity,并复写它的onCreate方法:
?
可能你这里有疑惑为何要需要一个list把Bitmap存储起来,这重要是为了避免GC引起的内存释放。好了我们将我们的内存打印出来会发现我们加入了10个Bitmap占用的实际内存是:26364K。我们在转化成为Drawable的方式:
?
我们再打印内存,发现内存已经降到了:7844K,这部分数据基本就证明了我们的结论。那么有没有可能是Resources缓存了相同的drawable。当然不是,你可以写一个简单代码测试一下:
?
你会发现输出的是false。实际上,享元这点我们基本达成了共识,关键Framwork来包装Drawable的时候还引入了组合模式,Framework本身缓存的是你这个Drawable的核心元数据。
?
从代码可以看出,系统对Drawable主要分成两大类,实际上还有一类熟悉预加载类的Drawable,不过不作为我们讨论的重点,由于我们load的并不属于color类型的Drawable,因此我们对应的享元池由mDrawableCache对象实现。
?
我们通过调用代码,会发现我们存储在数据池中的根本不是我们的Drawable对象,而是一个叫做Drawable.ConstantState类型的对象,而且用了弱引用包装起来。ConstantState是一个抽象类,有多个子类的实现
?
由于我们使用的是BitmapDrawable,而BitmapDrawable对应的ConstantState是BitmapState
?
我们可以看到BitmapState对应的newDrawable方法,它将自己作为参数传递给BitmapDrawable对象,也就是说BitmapDrawble组合了同一个的BitmapState。这样就实现了同一个Bitmap资源的复用。
跟到这,相信大家都跟我一样了解了Bitmap是如何从cache中取出,我们接下来看一下ConstantState是如何存入的。
?
可以看出,当你新生成一个Drawable的时候,就会将Drawable的ConstantState从Drawable中取出,然后放入你Cache池中。
原文地址: http://www.2cto.com/kf/201501/373804.html
我们在我们的Android项目中引入一个简单的图片test.png。由于我们只是为了享元的结论,我们定义一个简单的Activity,并复写它的onCreate方法:
?
?
?
?
?
?
?
跟到这,相信大家都跟我一样了解了Bitmap是如何从cache中取出,我们接下来看一下ConstantState是如何存入的。
?
原文地址: http://www.2cto.com/kf/201501/373804.html
相关文章推荐
- Android bitmap占用内存解析
- Android样式的开发:Style篇
- Android样式的开发:Property Animation篇
- Android样式的开发:View Animation篇
- Android样式的开发:drawable汇总篇
- Android样式的开发:layer-list篇
- Android样式的开发:selector篇
- Android样式的开发:shape篇
- Android Drawable 那些不为人知的高效用法
- Android自定义Dialog的一些问题
- android同时打开多个Activity的方式(应用于启动页面广告等场景)
- 简易的按钮事件(Button的4中事件处理)
- android framework初步理解
- Android系统之G-sersor调试
- android-tip-关于SpannableString的使用
- Android中EditText的字数统计
- Mac下配置android环境变量
- 4.4.1 Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
- Android 返回桌面的操作
- Android 富文本编辑器 图文混排