从网上学习了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);
优化前
优化后
时间: 2024-10-13 19:50:26