在上一管博客中写到使用viewpager实现左右滑动:http://my.oschina.net/u/1392566/blog/387084
在之后对代码重构时发了一个问题:
在重构代码前。我用了两张无经过压缩的体积为16m的PNG图片,重构时由于造成APK体积过大,我转换为jgp格式,体积为3M一张,图片转换前后的像素大小不变,紧紧是转换了格式,然后问题就出现了,我在使用PNG的时候,应用只是比较卡,但两张图片还是能够正常加载,但换成JPG后,反而在加载第二张图的时候就OOM,这个问题让我很疑惑。解惑:
在经过一轮的百度 google后,我找到了这编文章: URL:http://blog.csdn.net/kaitiren/article/details/8054856
这让我了解到了,原来当一个文件的byte[]转换为Bitmap的时候,这个Bitmap的内存占用大小是跟原文件的大小是无关的,因为它是根据像素来分配内存的,而且因为PNG和JPG的各自的特性,PNG的流在直接转换为Bitmap的时候不需要消耗额外的资源,而jpg在转换为Bitmap的时候,需要先进行纹理转换,这样在转换的过程中就比PNG多用了些临时性的内存,导致 在加载第二个jpg图过程中OOM了。
PS:当时如果PNG的体积再大一点,可能就也会引起OOM,也许我就没机会发现这一个事情,说来还真是挺巧的。
最后说一些关于Bitmap的事:
- Bitmap创建后在默认状态下是不可二次绘制的,这与一个属性inMutable有关。
- Bitmap对象在空引用后,可被Jvm回收,但是处理Bitmap对象的C对象中还有保留着一份缓存,这个是jvm不可自动回收的,所以养成好习惯是,当Bitmap对象将要被丢弃时,先调用BitmapAPI提供的recycle方法进行清理。