首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android内存泄漏位图

Android内存泄漏位图
EN

Stack Overflow用户
提问于 2014-11-01 15:58:48
回答 2查看 1.9K关注 0票数 1

当堆逐渐填满时,在继续我的游戏超过8次之后,我得到了OutOfMemory错误。在使用MAT分析我的游戏堆时,我了解到以下两个原因:

1) "“加载的一个android.graphics.Bitmap实例占用6554,944 (35.34%)个字节。内存累积在由"“加载的"byte[]”的一个实例中。

关键词android.graphics.Bitmap byte[]

2) "“加载的类"android.content.res.Resources”占用6446,248 (34.76%)字节。内存累积在由"“加载的"java.lang.Object[]”的一个实例中。

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

请建议一个解决方案

EN

回答 2

Stack Overflow用户

发布于 2014-11-01 16:13:42

尝试回收镜像,例如:

代码语言:javascript
复制
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);
}
票数 0
EN

Stack Overflow用户

发布于 2015-12-10 07:41:21

对于在游戏(如imageButtons等)中大量使用位图的情况,请确保您没有让活动保持活动状态。

  1. 您可以在onPause/onResume中使用setImageDrawable(null)对每个大项目进行加载/卸载游戏。然后,您必须在每个简历的视图中重新设置可绘制内容。如果你不做#3.finish
  2. 使用片段是可能的,这解决了当你销毁视图时它们卸载视图的问题。
  3. 如果你必须有activities,你可以在startActivity(myIntent)之后使用finish()。在这种情况下,您很可能需要覆盖后退按钮才能控制导航,因为您离开的活动不再位于后台堆栈中。

至于资源本身,你会读到很多关于drawable-nodpi的东西,但是如果你混合了编程布局和xml布局调整,你会想要确保你在所有的drawable-?dpi文件夹中都有资产,这对imageButtons来说有很大的不同。

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

如果你在代码中将pngs加载到视图中,那么使用Glide或Picasso,这样可以省去很多麻烦:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26687294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档