我继续玩游戏超过8次后出现OutOfMemory错误,因为堆逐渐填满。在使用MAT分析我的游戏堆时,了解了以下2个原因:
1)由“”加载的“android.graphics.Bitmap”的一个实例占用6,554,944(35.34%)个字节。内存在“。
加载的”byte []“的一个实例中累积关键字 android.graphics.Bitmap 字节[]
2)由“”加载的“android.content.res.Resources”类占用6,446,248(34.76%)个字节。内存在“。
加载的”java.lang.Object []“的一个实例中累积。关键字 java.lang.Object中[] android.content.res.Resources
请建议解决方案
答案 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等),请确保您没有保持活动。
您可以使用setImageDrawable(null)为每个大项目在onPause / onResume上播放加载/卸载游戏。然后,您必须使用每个简历在视图中设置drawable。如果你不做#3,这很好。
使用片段是可能的,这解决了在销毁视图时卸载视图的问题。
如果您必须有活动,可以在startActivity(myIntent)之后立即使用finish()。在这种情况下,您很可能需要覆盖后退按钮来控制导航,因为您离开的活动不再位于后台。
至于资源本身,你会阅读很多关于drawable-nodpi的东西,但如果你有混合的编程布局和xml布局调整,你会想要确保你有所有drawable资产 - ?dpi文件夹,它们对imageButtons产生了巨大的影响。
另外,不要在代码中使用setmaxheight,请使用layoutparams height。这在imageButtons上不止一次地为我杀死了记忆。
如果您在代码中将png加载到视图中,请使用Glide或Picasso并为自己节省一个受伤的世界:)