Android内存泄漏位图

时间:2014-11-01 07:58:48

标签: android memory-leaks bitmap

我继续玩游戏超过8次后出现OutOfMemory错误,因为堆逐渐填满。在使用MAT分析我的游戏堆时,了解了以下2个原因:

1)由“”加载的“android.graphics.Bitmap”的一个实例占用6,554,944(35.34%)个字节。内存在“。enter image description here

加载的”byte []“的一个实例中累积

关键字 android.graphics.Bitmap 字节[]

2)由“”加载的“android.content.res.Resources”类占用6,446,248(34.76%)个字节。内存在“。enter image description here

加载的”java.lang.Object []“的一个实例中累积。

关键字 java.lang.Object中[] android.content.res.Resources

请建议解决方案

2 个答案:

答案 0 :(得分:0)

尝试回收图片,例如:

if(image!= null) {
    ((BitmapDrawable)image.getDrawable()).getBitmap().recycle(); //here
    image= (ImageView) view.findViewById(R.id.image);
    image.setImageResource(yourresource);
}
else {
    image= (ImageView) view.findViewById(R.id.image);
    imageView.setImageResource(yourresource);
}

答案 1 :(得分:0)

对于游戏中大量使用位图(如imageButtons等),请确保您没有保持活动。

  1. 您可以使用setImageDrawable(null)为每个大项目在onPause / onResume上播放加载/卸载游戏。然后,您必须使用每个简历在视图中设置drawable。如果你不做#3,这很好。

  2. 使用片段是可能的,这解决了在销毁视图时卸载视图的问题。

  3. 如果您必须有活动,可以在startActivity(myIntent)之后立即使用finish()。在这种情况下,您很可能需要覆盖后退按钮来控制导航,因为您离开的活动不再位于后台。

  4. 至于资源本身,你会阅读很多关于drawable-nodpi的东西,但如果你有混合的编程布局和xml布局调整,你会想要确保你有所有drawable资产 - ?dpi文件夹,它们对imageButtons产生了巨大的影响。

    另外,不要在代码中使用setmaxheight,请使用layoutparams height。这在imageButtons上不止一次地为我杀死了记忆。

    如果您在代码中将png加载到视图中,请使用Glide或Picasso并为自己节省一个受伤的世界:)