android内存分析、加载本地图片内存优化

从网上学习了MAT插件来查看内存使用情况,分析之后发现手上的应用对本地图片这边的内存损耗很大,查了相关资料之后发现,如果采用setImageBitmap、setImageResource这些来加载本地资源,会产生较大的损耗。因为这些方法在完成 decode 后,最终都是通过 Java 层的 createBitmap 来完成的,需要消耗更多内存。因此,改用先通过 BitmapFactory.decodeStream 方法,创建出一个 bitmap,再将其设为 ImageView 的 source,decodeStream 最大的秘密在于其直接调用 JNI>>nativeDecodeAsset() 来完成 decode,无需再使用 Java 层的 createBitmap,从而节省了 Java 层的空间。如果在读取时加上图片的 Config 参数,可以更有效的减少加载的内存,从而更有效阻止抛出内存异常。(http://www.cnblogs.com/sunzn/archive/2013/03/14/2960293.html)

之后根据实际场景采取以下优化方案:

1.对图片做适当的裁剪、降低质量。(图片大小减少了很多,但是节省内存效果一般,堆占用从3M减少到2m)

2.因为使用场景是这张图片是一张大的背景图,在不知道setImageResource会产生比较大消耗的时候想出了把图片传到web上,利用加载图片的第三方库来加载的办法。

3.在查找资料了解了产生消耗的原因时,采取了decodeStream的办法,效果显著,减少到几十k。

InputStream is = this.getResources().openRawResource(R.drawable.bg_header_dynamic);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.RGB_565;  
options.inPurgeable = true;  
options.inInputShareable = true; 
options.inSampleSize = 1;
Bitmap btp =BitmapFactory.decodeStream(is,null,options);
im_bg.setImageBitmap(btp);

优化前技术分享

优化后技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。